字符串何时缓存它的哈希码?是在String对象创建时还是在调用hashcode方法之后? [重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串何时缓存它的哈希码?是在String对象创建时还是在调用hashcode方法之后? [重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

字符串何时缓存它的哈希码?我发现很多文章都说,字符串在创建字符串文字时会缓存它的哈希码。如果这是真的,那么当我们创建一个字符串对象时,为什么它的“hash”显示为0?我想在调用hashcode()方法之后,哈希码被缓存到对象头。

任何人都可以清除我的困惑吗?计算字符串哈希码并在对象创建期间缓存,或者一旦哈希码()得到计算,那么只有它被缓存在字符串对象中。

当我们将一个对象放在一个地图上时,在放置操作期间,哈希码会被计算出来,或者它已经在对象创建过程中计算过了,所以才被使用。

在调试过程中,我发现了实际的字符串散列(字符串文字散列),并且存储在散列映射桶中的散列是不同的。那么背后的逻辑是什么?

答案

这是getHashCode()的源代码

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/String.java#String.hashCode%28%29

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则计算。

以上是关于字符串何时缓存它的哈希码?是在String对象创建时还是在调用hashcode方法之后? [重复]的主要内容,如果未能解决你的问题,请参考以下文章

java的hashcode用来判断对象是否相等

Apache Ignite 客户端无法计算字符串键的哈希码

如果两个对象的哈希码相同则他们不一定相同,如果对象一致则哈希码一定相同

关于String的对象创建

为啥哈希图中的不可变对象如此有效?

浅层了解String——Java面向对象基础(13)