これは、次のコードの結果が実行されているものだと思うし、「Java仮想マシンの深い理解」の本の一例ですか?
public static void main(String[] args) {
Integer a = 1;
Integer b = 1;
Integer c = 3;
Integer d = 3;
Integer e = 138;
Integer f = 138;
Long g = 3L;
System.out.println(c == d);
System.out.println(e == f);
System.out.println(c == (a + b));
System.out.println(c.equals(a + b));
System.out.println(g == (a + b));
System.out.println(g.equals(a + b));
}
私たちが最初にメモリ内の比較アドレスが等しい== ==とオブジェクトの対等の違いを知っている必要があり、これを理解し、それが両者の比較が同じオブジェクトであるかどうか、です。一般的にこの方法は、オブジェクトの内容を比較等しい同じですが、上書きがない場合、equalsメソッドを、まだ比較する==使用し、実際には、道に等しいオブジェクトを呼び出すことです。
これを知ることは見下し続けます。
C == Dの
cおよびdは、しかし3であるが、同じメモリアドレスのc及びd Interger型Interger比較の等価タイプ==比較を使用します。だから私は、結果が偽であると思います。
電子== F
共感
C ==(A + B)
ので、B +の実行時には、整数bが確かに2つのオブジェクトが追加されていない、それは自動的にINTにaとbをアンパックし、その結果は、添加intで整数int型3とタイプ3は確かに同じではありません。だから、推測では、偽であります
c.equals(A + B)
整数値を比較するようにかなり多くのメモリアドレスよりも、同じであるので、結果が真の推測であります
グラム==(A + B)
同様に、偽の推測
g.equals(A + B)
gはロングタイプなので、int型とA + Bの比較結果は確かに偽です。だから、推測では、偽であります
そして、次のような結果である実行します。
true
false
false
false
false
false
2間違ったが、最初のものを見て推測します:
Integer c = 3;
Integer d = 3;
System.out.println(c == d);
Integer c = 3;
自動包装機序ので、相当Integer.valueOf(3)
、Integer d = 3
通常共感し、2つの異なるオブジェクトでなければなりませんが、比較結果メモリアドレスが同じであることが判明しました。私たちは、ソースコードに外観を命じました。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
ああ?IntegerCache一体何?結果cが== D trueで、ソースコードのクリックを見て、なぜあなたが理解できるように、キャッシュの名前が使用されて見ることができます探します。
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
IntegerCacheアレイはバッファまでの範囲内、すなわち、データバイト、-128と127の間の整数を使用する、Integer.valueOfを使用して、各時間がどこからピックアップし、c及びdは、実際にありそうオブジェクト。
c.equals(A + B)
ソースのこのビューには、知っています:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
INSTANCEOFオブジェクトが結果A + Bと同じであるintは、オブジェクトが属するかどうかを決定するためにソースコードの最初の実行、及び、梱包自動的に行われないobj instanceof Integer
状態が直接偽を返し、確立されていません。
実際には1は自動ボクシングとアンボクシングを使用しないでください