Java Hashcode值相同
为什么hashcode值相同Java Hashcode值相同,java,Java,为什么hashcode值相同 public static void main(String args[]) { String s1="abc"; String s2=new String("abc"); System.out.println("Hashcode s1-:"+ s1.hashCode()); System.out.println("Hashcode s2-:"+ s2.hashCode()); if(s1==s2){ Syst
public static void main(String args[])
{
String s1="abc";
String s2=new String("abc");
System.out.println("Hashcode s1-:"+ s1.hashCode());
System.out.println("Hashcode s2-:"+ s2.hashCode());
if(s1==s2){
System.out.println("==true:");
}
}
输出
Hashcode s1-:96354
Hashcode s2-:96354
两个相等对象的哈希代码应该相等 在这种情况下,对象是字符串,它们被认为是相等的,因为它们具有相同的字符序列abc
如果您想要基于对象标识而不是相等的哈希代码,请使用。这是因为字符串的哈希代码在java中是如何计算的 检查javadoc:
此外,两个字符串是相等的,因此它们的哈希代码必须相同。为什么它们不相同?hashcode是根据字符串的内容计算的,因此两者都是相同的 ==比较对象引用,因为您为s2使用了新字符串,所以引用不相同
您应该使用equals方法根据字符串的值来测试字符串的相等性。这是代码…因此两个equals对象的结果是相同的:
public int hashCode() {
int h = hash;
int len = count;
if (h == 0 && len > 0) {
int off = offset;
char val[] = value;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
因为哈希代码是使用公式计算的,该公式只接受字符串中存在的字符。字符串中的相同字符将产生相同的哈希代码
对于计算公式。根据规则,那些equals方法的对象返回true,应该具有相同的hashcode。字符串的hashcode是根据其字符计算的,因此是equals 计算如下:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
其中,s[i]是0String类的每个字符,其中实现了自己的hashcode方法。它的方法将哈希代码计算为:s[0]*31^n-1+s[1]*31^n-2+…+s[n-1]
因此,对于相同的字符序列,哈希代码将是相同的。JVM不会创建新字符串(如果已经存在),它只返回引用。当您尝试更改其中一个变量中的实际字符串时,将创建一个新字符串。
您可以在调试应用程序时检查它,字符串对象将具有不同的内存地址,但其中的值将具有完全相同的内存地址。因为字符串是相同的。有关更多信息,请参见此处@Sudhanshu,他称之为new String,因此它们不是指同一对象,因此,为什么==返回false。我认为他的困惑在于,他对==的测试返回false。感谢您宝贵的回答。在上面的示例中,我正在使用一个新关键字创建一个对象,因此它应该在堆上创建,而其他对象将在字符串池上创建,尽管它给出相同的哈希代码值,这就是所发生的情况。你有问题吗?还有其他问题吗?@MaheshPachpande使用==仅比较对象,即它们是否指向堆上的同一对象?在比较字符串是否相等时,应使用equals方法,即如果s1.equals2,则将比较字符串的实际值。