Java 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

为什么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){
        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,则将比较字符串的实际值。