-2

重複の可能性:
なぜこれらは == であり、`equals()` ではないのですか?

このコードが出力される理由

真実

真実

public class Test {
        public static void main(String[] args){
            String st1 = "abc";
            String st2 = "abc";

            Integer k1 = 100;
            Integer k2 = 100;

            System.out.println(st1 == st2);
            System.out.println(k1 == k2);
        }
    }

オブジェクトを比較するには、equals() メソッドを使用します。しかし、なぜこのように大丈夫なのですか?

4

3 に答える 3

2

==オブジェクト参照を比較します。文字列がハードコードされているため、それらはインターンされ、両方が同じ参照を使用するため、最初の真です。また、整数は一般的に使用される数値をキャッシュするため、両方の整数も同じオブジェクトを参照し、2 番目の参照比較が true になります。

于 2012-11-12T16:08:16.020 に答える
1
        System.out.println(st1 == st2);

st1は文字列定数プールに格納されます (最初に作成されたとき)。コンパイラがst2="abc"それを認識すると、 st2は文字列定数プール内の以前に作成されたオブジェクトを指します。つまり、st1st2"abc"は文字列定数プール内の同じオブジェクト ( ) を指し、==演算子は 2 つの参照変数が同じオブジェクトを指しているかどうかをチェックします。

        System.out.println(k1 == k2);

この場合、ラッパー インスタンスは狭い範囲にキャッシュされるため、==true が返されます。

于 2012-11-12T16:07:19.613 に答える
1

1) 両方の文字列は文字列リテラルとして扱われ、インターンされて同じメモリ位置に格納されます。

==参照の等価性をチェックするため、両方の参照が同じオブジェクトを指し、true を返します。

2)Integerインスタンスは狭い範囲でキャッシュされるため、 に対してk1 == k2true を返します100

于 2012-11-12T16:07:25.003 に答える