java - 字符串什么时候缓存它的哈希码?是在 String 对象创建期间还是在调用 hashcode 方法后?

标签 java string caching hashmap hashcode

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

有人可以解答我的困惑吗?字符串哈希码在对象创建期间计算并缓存,或者一旦计算了 hashcode(),则仅将其缓存在字符串对象中。

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

在调试过程中,我发现实际的字符串哈希(字符串文字哈希)和存储在 hashmap 存储桶中的哈希是不同的。那么这背后的逻辑是什么?

最佳答案

这是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,则进行计算。

关于java - 字符串什么时候缓存它的哈希码?是在 String 对象创建期间还是在调用 hashcode 方法后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49113505/

相关文章:

c# - 使用 C# 哪个更快 - System.Convert.ToString( objThatIsString) 或 (string)objThatIsString?

c++ - 为什么输出会跳过 gets(&char*) 的语句

python - 将带有换行符和制表符的 python 字符串转换为字典

php - 将大型 json 字符串存储到数据库 + 哈希

java - 使用带有选项的分布式缓存来处理缓存未命中

java - Project Reactor 超时处理

java - 使用 Ivy/ant 从命令行将符号名称解析为版本号?

asp.net - 高并发系统中的缓存访问

java - 在android studio的所有activity中保留账户信息

Java 缓冲图像未加载