这是我在StackOverflow上提的第一个问题:Why Objects.hash() returns different values for the same input?
之所以会遇到这个问题,是因为我准备在Spring
的项目中通过注解的方式使用EhCache
。如果没记错的话,@Cacheable
默认的key
是function的输入参数(不含方法名),然后在我的service
层中有许多的functions有同样的输入参数,比如getRoleByUserId(int userId)
, getInfoByUserId(int userId)
。如果这两个function都把cache
指向userCache
(@Cacheable(value = "userCache")
),这样会导致cache
会被误调用。
这对这种情况,我当时的做法是自己写一个MyKeyGenerator
。
1 |
|
我以为这样是万事无忧的,然而实际中,我发现我的Ehcache
根本没派上用场,每次service的调用都会执行数据库操作语句。经过丛丛调试,终于发现即使我每次的输入参数数据一模一样,但是每次生成的key
值不一样。
问题所在
后来发现问题出现是数字的hashCode()
上,如SO的评论所说,int[]
没有覆写hashCode()
(如果没记错的话,Java反射机制通过java.lang.reflect.Array
类来创建数组)。
修改如下
1 | int key = Objects.hashCode(method.getName(), Arrays.hashCode(params)); |