Integerの面接問題について「ファーウェイクラウド技術共有」を明らかにする.

9476 ワード

問題1を見てください.
 1 public class IntegerDemo {
 2    public static void main(String[] args) {
 3        Integer a = 888;
 4        Integer b = 888;
 5        Integer c = 88;
 6        Integer d = 88;
 7        System.out.println(a == b);
 8        System.out.println(c == d);
 9   }
10 }

上の問題の出力:
1 false
2 true

Javaの自動開梱と自動開梱のため、
Integer a = 888;

つまり
Integer a = new Integer(888);

自然上の変数aおよびbは、それぞれ異なるオブジェクト参照アドレスを指す.答えはfalseに違いない.
では、なぜc==dは同じオブジェクトを指すのでしょうか.
Integerの一部のソースコードを見てみましょう
 1   //      
 2    public static Integer valueOf(int i) {
 3        //i>=-128&&i<=127
 4        if (i >= IntegerCache.low && i <= IntegerCache.high)
 5            return IntegerCache.cache[i + (-IntegerCache.low)];
 6        return new Integer(i);
 7   }
 8    //Integer      
 9    private static class IntegerCache {
10        static final int low = -128;
11        static final int high;
12        //    
13        static final Integer cache[];
14 
15        static {
16            // high value may be configured by property
17            int h = 127
18            //      ....
19            high = h;
20            //   cache    
21            //cache   =127-(-128)+1=256
22            cache = new Integer[(high - low) + 1];
23            int j = low;
24            for(int k = 0; k < cache.length; k++)
25                // -128 127        Integer  
26                //    cache   。
27                cache[k] = new Integer(j++);
28       } 
29       private IntegerCache() {}
30   }

面接問題2:
public class IntegerDemo {
   public static void main(String[] args) {
       Integer a = new Integer(88);
       test(a);
       System.out.println(a);
  }
   private void test(Integer integer){
       integer=new Integer(99);
  }
}

上はどのくらい出力すればいいですか?
面接問題3:
1 public class IntegerDemo {
2    public static void main(String[] args) {
3        Integer a = new Integer(88);
4        a = 99;
5        System.out.println(a);
6   }
7 }

ここはまたどのくらい出力しますか?
ソースコードを見続けます.
1 public final class Integer extends Number implements Comparable {
2  //final    ,            ,                 
3  //          ,                      。
4  private final int value;
5  public Integer(int value) {
6     this.value = value;
7  }
8 }

面接問題3のa=99はa=new Integer(99)に相当する.新しいオブジェクト参照アドレスをaに再与えたので、aは変わり、最後の出力は99になります.
では、面接問題2は?
Javaでは、Javaは値伝達のみであることはよく知られていますが、値伝達は、メモリ内の数値の値伝達とメモリアドレスの数値の値伝達に分けられ、Integer変数パラメータを伝達し、実際にはコピーを構築しています.このコピーでは、元のInteger変数の非finalメンバー変数を変更するしかありません.(もしあれば、他のタイプであってもよい)、上にも述べたように、Integerタイプのfinal変数を修正すると、この変数のコピーを上書きする新しいnew変数になるので、元のInteger a変数は元のままで、testという方法のコピー変数が変わっただけで、このように理解すれば分かります.だから面接問題2出力88.
ソース:Javaバックエンドテクノロジスタック