为什么这与String.java中的另一个对象检查相等?

为什么这与String.java中的另一个对象检查相等?,java,string,Java,String,在String.java中,此代码位于.equals()方法的开头: public boolean equals(Object anObject) { if (this == anObject) { return true; } // ... check if instance of String, etc. } 此检查是否纯粹出于性能原因(即不包括它将对照自身检查此的字符)?是的。因为它们是对同一对象的引用,所以它们是相等的 String a = "f

在String.java中,此代码位于
.equals()
方法的开头:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    // ... check if instance of String, etc.
}

此检查是否纯粹出于性能原因(即不包括它将对照自身检查
的字符)?

是的。因为它们是对同一对象的引用,所以它们是相等的

String a = "foobar";
a.equals(a) // true

在Java中,字符串是字符数组的表示形式。在该对象上调用
.equals()
时,它将检查数组中的每个字符,以查看它们在循环时是否相同


.equals()
开头的比较检查是否与同一对象进行比较,如果是,则计时从O(n)(n是字符串的大小,以字符表示)到O(1)。

关于字符串的事情是,当创建字符串时,它们会保存在堆中以供重用。。所以当你这么做的时候

String a = "abc";
String b = "abc"; //implicitly referencing same string object as a
a.equals(b); //true because of reference
a == b; //true because of reference
它们实际上隐式引用堆中的同一对象

除非您这样做:

String a = "abc";
String b = new String("abc"); //explicitly creating a new string object
a.equals(b); //true because of value
a == b; //false because of reference

比较字符之前,请先检查哈希代码<代码>=检查内存中的引用,如果它们相同,则将同一对象与自身进行比较没有意义。此检查是否纯粹出于性能原因?是的。这种优化可能特别有用,因为Java中有很多字符串都是,但由于不是所有字符串都是内部的,所以它也可以依赖于深度(逐字符)相等比较。==不是对hashCode()的检查,尽管这不是我第一次看到这种想法在上面表达。public static类Thingy{String value;public Thingy(String value){this.value=value;}@Override public int hashCode(){return 1;}}}}}public static void main(String[]args){Thingy A=new Thingy(“A”);Thingy B=new Thingy(“B”);System.out.println(“A.hashCode()==B.hashCode():”+(A.hashCode()=B.hashCode());System.out.println(“A==B:+(A==B));}@user2321368-这是一个很好的观点——但是很恶心!!!也许你可以链接到要点或其他内容,而不是试图将所有代码与注释内联。拥有相同的哈希代码并不意味着相等,因为两个相等的对象需要具有相同的哈希代码,但两个不同的对象不需要具有不同的哈希代码。(因此,如果哈希函数做得不够好,就会产生哈希冲突)请注意,相同的逻辑也适用于
instanceof
检查和长度比较。这两种都是廉价的检查,可以给出O(1),而不必比较每个字符。