JavaにおけるStringの==とequalsの違い
1849 ワード
String abc = "abc";
String abc2 = "abc";
String ab = "ab";
String c = "c";
String abc3 = ab + c;
System.out.println( abc );
System.out.println( abc2 );
System.out.println( abc3 );
System.out.println( abc == abc2 );
System.out.println( abc.equals( abc2 ) );
System.out.println( abc == abc3 );
System.out.println( abc.equals( abc3 ) );
印刷結果は次のとおりです.
abc
abc
abc
true
true
false
true
に注意
System.out.println( abc == abc3 );
印刷結果はfalseです.
abcとabc 2は、システム最適化のいくつかの理由により、2つの「abc」を定義しているが、システムは、2つの空間を割り当ててそれぞれ「abc」にアクセスするのではなく、後のabc 2をabcが存在する物理メモリ空間に指すだけであり、==を加えると、実際には比較対象が存在する物理メモリアドレスにすぎないため、結果はtrueである.逆に、abc 3は2つの異なる物理メモリ空間上の値を統合したものであるため、abcとabc 3が指す物理メモリ空間アドレスは異なる.
またequalsメソッドは,まず==で判断し,trueであればすぐに返し,そうでなければ1文字ずつ比較する.次のソースコードを参照してください.
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}