2017-10-14 7 views
-2

== 2つの異なるオブジェクトsとpのnewの結果を使って作成されたStringの変数に対して、私が理解しているfalse(行1)を返しますが、なぜ3行目と4行目(コメント行番号)2つの異なるオブジェクトに対してTestクラスの変数が==操作に対してtrueを返し、同じ操作でStringオブジェクトに対してfalseが返されるのはなぜですか?

私は、==は参照の比較のためのものであり、参考比較のためのものであれば疑問があるということを認識しています。なぜなら、jが整数であり、なぜなら不変性の概念はないからです。 String(String s)と新しいオブジェクトを作成するたびに?

class World 
{ 
    public static void main(String[] args) 
    { 
     String s=new String("B"); 
     String p=new String("B"); 
     System.out.println(s==p);     //false line 1 
     Test t1= new Test("A",4); 
     Test t2= new Test("A",4); 
     System.out.println(t1==t2);     //false  line 2 
     System.out.println(t1.s==t2.s);    //true  line 3 
     System.out.println(t1.j==t2.j);    //true  line 4 
    } 
} 

class Test 
{ 
    String s; 
    int j; 
    Test(String s, int j) 
    { 
    this.s=s; 
    this.j=j; 
    } 
} 
+4

"t1とt2が異なるオブジェクトであるため、3行目と4行目が異なる理由* - ' t1'と 't2'は異なるオブジェクトですが、3行目で比較していません。それらが保持する文字列は、異なるオブジェクトではありません。同じ文字列リテラル "A"に2つの参照があります。これは、新しい 'String'オブジェクトを明示的に作成した' s'や 'p'で行ったのとは非常に異なります。 – azurefrog

答えて

1

にあなたのコンストラクタを変更してみてください文字列は、通常のjavaにキャッシュされるので、同じ値を持つ2つの文字列が同一の参照を持っているかもしれません。 (同じことが整数の場合、ある範囲内のオブジェクトは、同じ値を持つ場合、同じオブジェクトとして参照されます)。これはコンストラクタ内のt1とt2のsの値と同じオブジェクト "A"を持つことにつながります。 2つのintプリミティブは、同じ値を持つ場合、常に同じです。

+0

あなたはこのステートメントを説明してもらえますか?「同じことが整数のためにあります、特定の範囲のオブジェクトが同じオブジェクトとして参照されている場合、同じ値を持っていれば」 私の知る限り、これはオートボケの場合にのみ発生します –

+0

2つの小さな整数を持つ:整数i1 = Integer.valueOf(127);整数i2 = Integer.valueOf(127); comparsionはi1 == i2となる。代わりに、キャッシュ領域の外側から2つの整数、つまりInteger i1 = Integer.valueOf(1270)を使用すると、 整数i2 = Integer.valueOf(1270); comparsionはi1!= i2となる。簡単な単体テストで簡単に検証できます。または、https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf(int) – juwil

+0

の仕様を参照してください。これは、内部的にvalueOf()を使用するオートボクシングの場合に当てはまります。上記の例では2つのどちらも起こっていません。 –

1

==演算子を2つの整数で使用するJavaでは、それらを値で比較します。一方、2つの文字列で==を使用すると、2つのクラスがその値ではなくメモリ内の位置を比較します。 あなたのクラスフィールドにあなたの引数と同じ名前をつけているので、Testクラスでは注意する必要があります。実際にjとsの値を自分のものとしないかもしれません。

Test(String str, int i){ 
    s = str; 
    j = i; 
} 
+0

これを割り当てに使用するので、名前を変更する必要はありません。そしてそれは問題とは関係がありません。 – juwil

関連する問題