2 つの Integer オブジェクトを比較する場合、100 は 100 と等しく、1000 は 1000 と等しくないのはなぜですか?

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 までのデータが最も頻繁に使用されるためであり、頻繁なオブジェクト作成によるメモリ消費を削減するために、ここでは実際にフライウェイト モードが使用され、空間と時間のパフォーマンスが向上します。

おすすめ

転載: blog.csdn.net/weixin_45817985/article/details/133063935