You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用new创建的String对象与字面量String哈希码相同?

为什么new String创建的字符串和常量池中的字符串哈希码相同?

示例代码

public class Main {

    public static void main(String[] args) {
        String str1="shrey";
        String str2="shrey";
        String str3=new String("shrey");
        System.out.println(str1.hashCode());
        System.out.println(str2.hashCode());
        System.out.println(str3.hashCode());
    }
}

运行结果

输出结果:str1、str2、str3的哈希码完全相同

疑问

我了解Java会使用字符串常量池(String Pool),str1和str2通过字符串字面量创建,指向同一对象,因此哈希码相同。但str3是用new关键字创建的,我原本预期它的哈希码会不同,结果却一致,这是为什么?


解答

哈希码的计算逻辑由String类的hashCode()方法定义,和对象是否存在于字符串常量池无关。

Java中String的hashCode()是基于字符串的实际内容计算的,具体计算公式为:
hash = s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
其中s[i]代表字符串的第i个字符,n是字符串的长度。

  • str1和str2指向常量池中的同一个字符串对象,内容都是"shrey",哈希码自然相同。
  • str3通过new String("shrey")创建了一个全新的String对象,但这个对象内部存储的字符序列和常量池中的"shrey"完全一致,按照hashCode()的计算规则,得到的哈希码必然和str1、str2一致。

总结:哈希码由字符串的字符内容决定,而非对象实例本身。只要两个字符串的字符序列完全相同,无论它们是不是同一个对象,哈希码都会相同。


内容的提问来源于stack exchange,提问作者Shrey Saxena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:32:09