転載https://www.cnblogs.com/liuling/archive/2013/05/05/intAndInteger.html
Integerとintの比較についてどのくらい知っていますか?
インタビュアーがIntegerとintの違いを尋ねた場合:ほとんどの人は2つのことしか言わないと推定されます。Ingeterはintのパッケージクラスであり、intの初期値は0で、Ingeterの初期値はnullです。しかし、インタビュアーがInteger i = 1を要求した場合、int ii = 1; i == iiは真か偽か 答えられない方もいらっしゃると思われますが、他の人に聞いてみると混乱する方が多いと推定されます。だから私はそれらを要約し、みんなを助けたいと思っています。
package com.test;
public class TestInteger {
/**
* @param args
*/
public static void main(String[] args) {
int i = 128;
Integer i2 = 128;
Integer i3 = new Integer(128);
//Integer会自动拆箱为int,所以为true
System.out.println(i == i2);
System.out.println(i == i3);
System.out.println("**************");
Integer i5 = 127;//java在编译的时候,被翻译成-> Integer i5 = Integer.valueOf(127);
Integer i6 = 127;
System.out.println(i5 == i6);//true
/*Integer i5 = 128;
Integer i6 = 128;
System.out.println(i5 == i6);//false
*/ Integer ii5 = new Integer(127);
System.out.println(i5 == ii5); //false
Integer i7 = new Integer(128);
Integer i8 = new Integer(123);
System.out.println(i7 == i8); //false
}
}
まず、17行目と18行目の出力結果はどちらも真です。これは、Integerとintの比率が自動的にボックス解除されるためです(jdk1.5以上)。
22行目の結果はtrueで、25行目の結果はfalseです。実際、Integer i5 = 127をコンパイルすると、javaは-> Integer i5 = Integer.valueOf(127);に変換されるため、重要なのはvalueOf()関数を確認することです。valueOf()関数のソースコードを見て理解してください。JDKソースコードのvalueOf関数は次のようになります。
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
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() {}
}
ソースコードを見ると、-128から127までの数値がキャッシュされることは誰でも理解できます。Integeri5 = 127の場合、127がキャッシュされます。次にInteger i6 = 127が書き込まれるとき、キャッシュから直接取得されます。 、新品ではありません。したがって、22行目の結果は真であり、25行目は偽です。
27行目と30行目では、オブジェクトが異なるため、falseです。
上記の状況の私の要約は次のとおりです。
①いずれの場合でも、整数と新しい整数は等しくありません。ボックス化解除プロセスは行われず、i3の参照はヒープを指し、i4は特別なメモリ(定数プール)を指し、それらのメモリアドレスは異なるため、falseです
。②両方が新しい整数ではない場合、数値が128から127まではtrue、それ以外の場合はfalseです
。Integeri2 = 128をコンパイルすると、-> Integer i2 = Integer.valueOf(128);に変換され、valueOf()関数は-128から127になります。
③の間の数をキャッシュします両方とも新しい、両方とも偽です
④整数と整数の比率(新しいかどうかにかかわらず)は真です。
何かが間違っていると思われる場合は、指示を歓迎します。