困惑的Java: 数组的hashCode()

这是我在StackOverflow上提的第一个问题:Why Objects.hash() returns different values for the same input?

hashCode

之所以会遇到这个问题,是因为我准备在Spring的项目中通过注解的方式使用EhCache。如果没记错的话,@Cacheable默认的key是function的输入参数(不含方法名),然后在我的service层中有许多的functions有同样的输入参数,比如getRoleByUserId(int userId), getInfoByUserId(int userId)。如果这两个function都把cache指向userCache(@Cacheable(value = "userCache")),这样会导致cache会被误调用。

这对这种情况,我当时的做法是自己写一个MyKeyGenerator

1
2
3
4
5
6
@Override
public Object generate(Object target, Method method, Object... params) {
int key = Objects.hashCode(method.getName(), params);
//log.info("key = " + key);
return key;
}

我以为这样是万事无忧的,然而实际中,我发现我的Ehcache根本没派上用场,每次service的调用都会执行数据库操作语句。经过丛丛调试,终于发现即使我每次的输入参数数据一模一样,但是每次生成的key值不一样。

问题所在

后来发现问题出现是数字的hashCode()上,如SO的评论所说,int[]没有覆写hashCode()(如果没记错的话,Java反射机制通过java.lang.reflect.Array类来创建数组)。

修改如下

1
int key = Objects.hashCode(method.getName(), Arrays.hashCode(params));