为何使用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
相关产品推荐
相关产品推荐

