Java 字符串何时缓存它';什么是哈希码?它是在字符串对象创建期间还是在hashcode方法被调用之后?

Java 字符串何时缓存它';什么是哈希码?它是在字符串对象创建期间还是在hashcode方法被调用之后?,java,string,caching,hashmap,hashcode,Java,String,Caching,Hashmap,Hashcode,字符串什么时候缓存它的哈希代码?我发现很多文章说,当我们创建字符串文字时,字符串缓存它的哈希代码。如果这是真的,那么当我们创建一个字符串对象时,为什么它的“哈希”显示为0? 我认为一旦调用hashcode()方法,hashcode就会被缓存到对象头中 谁能消除我的困惑?字符串hashcode是在对象创建期间计算并缓存的,或者hashcode()计算完成后,只有它缓存在字符串对象中 当我们把一个对象放到一个映射上时,在put操作期间,hashcode正在被计算,或者在对象创建期间它已经被计算过了,

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

谁能消除我的困惑?字符串hashcode是在对象创建期间计算并缓存的,或者hashcode()计算完成后,只有它缓存在字符串对象中

当我们把一个对象放到一个映射上时,在put操作期间,hashcode正在被计算,或者在对象创建期间它已经被计算过了,所以刚刚被使用


在调试期间,我发现实际的字符串散列(字符串文字散列)和存储在hashmap bucket中的散列是不同的。那么这背后的逻辑是什么?

这是getHashCode()的源代码

public int More…hashCode(){
1494 int h=散列;
1495如果(h==0){
1496 int off=偏移量;
1497字符val[]=值;
1498 int len=计数;
1499
1500(int i=0;i
如您所见,hashcode是在请求hashcode时计算的


第1495行上的测试测试是否为0。如果它是0,则会进行计算。

这是getHashCode()的源代码

public int More…hashCode(){
1494 int h=散列;
1495如果(h==0){
1496 int off=偏移量;
1497字符val[]=值;
1498 int len=计数;
1499
1500(int i=0;i
如您所见,hashcode是在请求hashcode时计算的


第1495行上的测试测试是否为0。如果它是0,则会进行计算。

“我发现很多文章都说,在创建字符串文字时,字符串会缓存其哈希代码”请提供指向这些文章的链接。@AndyTurner您好,请以下面的链接为例。这里写得很清楚,“因为字符串是不可变的,它的哈希代码在创建时被缓存,不需要再次计算。”这是完全错误的,正如@JimGarrison发布的链接所示:它是在您第一次需要它时计算的。字符串是不可变的,因此其哈希代码不需要计算两次;但是如果你根本不需要它,它就不会被计算。感谢@AndyTurner的澄清。那么我们可以说,当我们将一个元素作为字符串作为键插入hashmap时,实际上先计算出键的散列,然后缓存在内存中,当我们调用get方法时,也需要计算散列,它只是使用了在put操作中已经计算过的散列。“我发现很多文章说,在我们创建字符串文字时,字符串缓存了它的散列代码”请提供这些文章的链接。@AndyTurner您好,请以下面的链接为例。这里写得很清楚,“因为字符串是不可变的,它的哈希代码在创建时被缓存,不需要再次计算。”这是完全错误的,正如@JimGarrison发布的链接所示:它是在您第一次需要它时计算的。字符串是不可变的,因此其哈希代码不需要计算两次;但是如果你根本不需要它,它就不会被计算。感谢@AndyTurner的澄清。那么我们可以说,当我们将一个元素作为字符串作为键插入hashmap时,实际上先计算出键的散列,然后缓存在内存中,当我们调用get方法时,也需要计算散列,它只是使用了put操作中已经计算过的哈希值。回答得很好!它应该适用于文本和对象。回答得很好!它应该适用于文本和对象。
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    }