这是我在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)); |