Integerの面接問題について「ファーウェイクラウド技術共有」を明らかにする.
9476 ワード
問題1を見てください.
上の問題の出力:
Javaの自動開梱と自動開梱のため、
つまり
自然上の変数aおよびbは、それぞれ異なるオブジェクト参照アドレスを指す.答えはfalseに違いない.
では、なぜc==dは同じオブジェクトを指すのでしょうか.
Integerの一部のソースコードを見てみましょう
面接問題2:
上はどのくらい出力すればいいですか?
面接問題3:
ここはまたどのくらい出力しますか?
ソースコードを見続けます.
面接問題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バックエンドテクノロジスタック
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バックエンドテクノロジスタック