Java のメモリ管理について質問があります。
次のコードを試すと:
Integer a = 1;
Integer b = 1;
System.out.println(a==b); // this gives "true"
でも、
Integer a = 256;
Integer b = 256;
System.out.println(a==b); //this gives "false"
なんで?
どうもありがとう。
Java のメモリ管理について質問があります。
次のコードを試すと:
Integer a = 1;
Integer b = 1;
System.out.println(a==b); // this gives "true"
でも、
Integer a = 256;
Integer b = 256;
System.out.println(a==b); //this gives "false"
なんで?
どうもありがとう。
これは、「オートボクシング」がを使用しInteger.valueOf
、小さな整数値Integer.valueOf
のオブジェクトのキャッシュを保持するためです。Integer
JLSの内容は次のとおりです。
「ボックス化されている値pがtrue、false、1バイト、または\u0000から\u007fの範囲のchar、または-128から127(両端を含む)のintまたはshortの数値の場合、r1とr2を結果とします。 pの任意の2つのボクシング変換の。r1==r2の場合は常にそうです。」 JLS5.1.7。
演算子を使用してオブジェクト==
のペアを比較するとInteger
、実際にはオブジェクト参照が比較されます。したがって、true
ボクシングが同じキャッシュInteger
オブジェクトを提供しfalse
た場合とそうでない場合の取得。JLSは、指定された範囲でこの動作を保証しますが、メソッドの実装がより広い範囲の値をキャッシュすることも許可することに注意してください。valueOf
equals(Object)
肝心なのは、オブジェクトを比較するために使用する必要があるということです...オブジェクトが同じオブジェクトであるかどうかを実際にテストしようとしている場合をInteger
除きます。
私が読んだことによると、「整数」はヒープ内に「オブジェクト」を作成する必要があるため、2つのオブジェクトは同じである必要があります。
コードが明示的にを実行する場合new Integer(...)
、新しいInteger
オブジェクトを作成することが保証されます。ただし、オートボクシングはを使用しInteger.valueOf(...)
、そこでキャッシュ動作が実装されます。
==
オブジェクトに参照等式()を使用しないでください。最初の128個のオブジェクトがクラスInteger
によってキャッシュされるため、最初の例ではtrueと出力されます。Integer
使用する.equals()
値がデータ表現の範囲よりも大きい場合、それらはラップされているため、異なるオブジェクトになります。これで、オブジェクトIDのようにペアリングしています。
You are comparing objects' addresses