Java-定数プールの理解と試行

2569 ワード

  • 定数プール定数プールについては、頻繁なオブジェクトの作成と破棄を回避するためにシステムのパフォーマンスに影響を与え、オブジェクトの共有を実現します.文字列定数プールのように、コンパイルフェーズではすべての文字列文字を定数プールに配置します.Integerの定数プールでは、[-128127]間でオブジェクトが共有されます.つまり、
  • です.
    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は同じアドレスを指すためである.
  • 二等号==の意味基本データ型間に二等号を適用し、それらの数値を比較する.複合データ型(クラス)間に2等号を適用し、メモリ内の格納アドレスを比較します.
  • equals()とhashCode()の契約:2つのオブジェクトが等しい場合、hash codeは等しくなければなりません.しかし、2つのオブジェクトのhash codeが等しい場合、この2つのオブジェクトは必ずしも等しいとは限らない.
  • JavaにおけるhashCodeメソッドは,オブジェクトに関する情報(例えば,オブジェクトの格納アドレス,オブジェクトのフィールドなど)を一定のルールに従ってハッシュ値としてマッピングする.

  • カスタムクラス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            
    	}
    }