2 つの Integer オブジェクトを比較する場合、100 は 100 と等しく、1000 は 1000 と等しくないのはなぜですか?
検証ポイント
Integer は開発でよく使われるパッケージングクラスであり、その基礎を理解することが非常に重要ですが、面接官は日常生活での知識の蓄積が得意かどうか、そしてその知識についてじっくり考えたいと考えているためです。
この質問に対する私の答えは次のとおりです。
1. 具体的な例を見てみましょう。
public boolean xxx(Integer a,Integer b){
...
if(a==b){
return true;
}
...
return false;
}
a和b输入100,返回的结果是true
a和b输入1000,返回的结果是false
上記のコードでは、a と b が両方とも 100 と入力すると結果は true になりますが、a と b が 1000 の場合は false と報告されます。何が起こっているのでしょうか?
2. Integer のメソッドのソース コードの値を表示します。
public final class Integer extends Number implements Comparable<Integer>{
...
public static Integer valueOf(int i){
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
}
通过源码可以看到IntegerCache.cache、和IntegerCache.low、IntegerCache.high在
对数据结果进行影响。
IntegerCache.low の値は -128、IntegerCache.high の値は 127 です。
つまり、ターゲット値が -128 ~ 127 の場合、値はキャッシュ配列から直接取得され、それ以外の場合は新しいオブジェクトが作成されます。なぜ-128~127なのでしょうか?その理由は、int 範囲では -128 から 127 までのデータが最も頻繁に使用されるためであり、頻繁なオブジェクト作成によるメモリ消費を削減するために、ここでは実際にフライウェイト モードが使用され、空間と時間のパフォーマンスが向上します。