Java-定数プールの理解と試行
2569 ワード
Integer a = 121;
Integer b = 121;
Integer c = 500;
Integer d = 500;
上のコードフラグメントから,aとb,cとdの値は同じであるが,以下のように判断する.
System.out.println(a == b)//---->?
System.out.println(a.equals(b))//---->?
System.out.println(c == d)//---->?
System.out.println(c.equals(d))//---->?
結果は何でしょうか.
//
System.out.println(a == b)//---->true
System.out.println(a.equals(b))//---->true
System.out.println(c == d)//---->false
System.out.println(c.equals(d))//---->true
これは、Integerのオブジェクトが[-128127]に値が含まれている場合、すなわちa、bの値であり、a、bは1つのオブジェクトを共有し、すなわちa、bは同じアドレスを指すためである.
カスタムクラスIntegerExtを実装するには、次の手順に従います.
public class IntegerExt {
private int i;
//TODO
// :
// i [-255,254] ,
}
要求:
IntegerExt i1 = IntegerExt.getInstance(200);
IntegerExt i2 = IntegerExt.getInstance(200);
IntegerExt i3 = IntegerExt.getInstance(800);
IntegerExt i4 = IntegerExt.getInstance(800);
次のようになります.
//i1 == i2 true
//i1.equals(i2) true
//i3 == i4 false
//i3.equals(i4) true
分析:
その結果、i 1とi 2の値は範囲内であり、i 1とi 2の値は同じであり、両者は同じオブジェクトを参照していることがわかる.i 3、i 4の値は同じですが、2つの異なる変数を参照します.その鍵は、範囲内の変数が同じオブジェクトを参照することをどのように保証するかです.
解決(単例モードで実現)
//
public class IntegerExt {
private int i;
private static IntegerExt integerExt;
private IntegerExt(int i) {
this.i = i;
}
public int toIntValue() {
return i;
}
public static IntegerExt getInstance(int i) {
if(i>=-128 && i<=127){
if(integerExt != null){
return integerExt;
}else{
integerExt = new IntegerExt(i);
}
}else{
integerExt = new IntegerExt(i);
}
//
//
return integerExt;
}
@Override
public int hashCode() {
return i;
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof IntegerExt))
return false;
return this.hashCode() == obj.hashCode();
// equals hashcode
}
}