字符串什么时候缓存它的哈希码?我发现很多文章都说,当我们创建字符串文字时,字符串会缓存它的哈希码。如果这是真的,那么当我们创建一个字符串对象时,为什么它的“hash”显示为0? 我认为一旦调用了 hashcode() 方法,哈希码就会被缓存到对象头中。
有人可以解答我的困惑吗?字符串哈希码在对象创建期间计算并缓存,或者一旦计算了 hashcode(),则仅将其缓存在字符串对象中。
当我们将一个对象放在 map 上时,在放置操作期间,哈希码正在被计算,或者在对象创建过程中已经计算出来了,所以就被使用了。
在调试过程中,我发现实际的字符串哈希(字符串文字哈希)和存储在 hashmap 存储桶中的哈希是不同的。那么这背后的逻辑是什么?
最佳答案
这是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,则进行计算。
关于java - 字符串什么时候缓存它的哈希码?是在 String 对象创建期间还是在调用 hashcode 方法后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49113505/