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;
    }