字符串何时缓存它的哈希码?我发现很多文章都说,字符串在创建字符串文字时会缓存它的哈希码。如果这是真的,那么当我们创建一个字符串对象时,为什么它的“hash”显示为0? 我想在调用hashcode()方法之后,哈希码被缓存到对象头。
有人可以清除我的困惑吗?字符串哈希码是在对象创建时计算并缓存的,或者一旦哈希码()得到计算,那么只有它被缓存在字符串对象中。
当我们在地图上放置一个对象时,在放置操作期间,哈希码会被计算出来,或者在对象创建过程中已经计算好了,所以才被使用。
在调试期间,我发现了实际的字符串哈希(字符串文字哈希),并且存储在哈希映射桶中的哈希是不同的。那背后的逻辑是什么?
答案 0 :(得分:2)
这是getHashCode()
的源代码public int More ...hashCode() {
1494 int h = hash;
1495 if (h == 0) {
1496 int off = offset;
1497 char val[] = value;
1498 int len = count;
1499
1500 for (int i = 0; i < len; i++) {
1501 h = 31*h + val[off++];
1502 }
1503 hash = h;
1504 }
1505 return h;
1506 }
如您所见,哈希码是在请求哈希码时计算的。
第1495行的测试测试它是否为0.如果它为0则计算。