JAva学習ノート:梱包と取り外し、包装器とバッファ


jdk1.5以降はIntegerを用いてInteger a=3を例示する.これは自動梱包int i=new Integer(2);これは自動分解箱であり、基本的なタイプとそれに対応する包装タイプは必要に応じて互いに変換することができ、具体的なプロセスはコンパイラによって完成され、例えば自動梱包:Integer a=3;実はコンパイラが呼び出したのはstatic Integer valueOf(int i)という方法JDKを調べて、valueOf(int i)が指定したint値を表すIntegerオブジェクトを返すと、Integer a=3になります.   =>    Integer a=Integer.valueOf(3);
 
対応するint intValue()は、そのIntegerオブジェクトのint値を返します.
 
Integerキャッシュを見てみましょう.以下はIntegerCacheクラスのソースコードです.注釈を付けて、議論しやすいです.
private static class IntegerCache   //    
{     
    static final int high;     
    static final Integer cache[];   //cache Integer    
  
    static  //    
    {     
        final int low = -128;       //    
        int h = 127;                // 127   
        if (integerCacheHighPropValue != null) // if , ,    
        {     
            int i = Long.decode(integerCacheHighPropValue).intValue();     
            i     = Math.max(i, 127);     
            h     = Math.min(i, Integer.MAX_VALUE - -low);     
        }     
        high = h;  // high 127   
  
        cache = new Integer[(high - low) + 1];  // 256    
        int j = low;                            //j -128   
        for(int k = 0; k < cache.length; k++)   //       
            cache[k] = new Integer(j++);        // -128~127 256    
    }     
    private IntegerCache(){}  // ,    
}  

  
valueOfの方法を見てみましょう
 
public static Integer valueOf(int i)    
{     
    if(i >= -128 && i <= IntegerCache.high)   
    {   
        // i -128~127 , i Integer    
        return IntegerCache.cache[i + 128];     
    }       
    else   
    {   
        return new Integer(i);  //    
    }       
}   

 
 
valueOfメソッドではIntegerCacheというクラスが自動的に呼び出され、IntegerCacheが初期化されるとメモリにIntegerバッファcache[],-128~127区間のint値に対応するパッケージオブジェクトjavaが使用されるこのメカニズムは、データの入力と出力を最小化する目的を達成するために最適化されたものであり、効率を向上させる他のパッケージ:Boolean:(すべてキャッシュ)Byte:(すべてキャッシュ)
 
Character(<=127キャッシュ)Short(-128~127キャッシュ)Long(-128~127キャッシュ)
 
Float(キャッシュなし)Doulbe(キャッシュなし)
Integerバッファの理解を補足します.
(この観点は私がネットで見たいくつかの資料と自分でソースコードを見た後のいくつかの推測ですが、どの本でも見たことがありません.最近think in javaを見ようとしています)バッファプールはjavaのシステムの最適化であり、メモリを管理するメカニズムであり、データ構造であり、複数のバッファを管理することができ、IntegerCacheはバッファであり、cache[]配列に保存されているのはIntegerタイプのオブジェクトを指すポインタです.Integerバッファオブジェクトはnewから出てきたが、バッファプールによって管理されているので、一緒に議論してください.そしてあるネットユーザーの質問に答えました.質問は典型的で、私は上に貼りました.
まずString str=「aaa」;「aaa」自体は文字列オブジェクトであり、コンパイル時にデータ領域に定義され、実行時に定数プール、またはデータ領域に直接作成され、strはプログラムがこのコードを実行するとシステムがメモリのスタック領域に割り当てるポインタ変数であり、String str=new String(「aaa」)である場合、定数プール内の「aaa」オブジェクトを指す.コンパイル時にaaaオブジェクトがデータ領域に作成され、実行時にnew String()に実行されると、プログラムは動的にメモリ領域を開き、データ領域のaaaオブジェクトをスタックにコピーし、strに参照されるスタックに戻ります.この文は新しいStringオブジェクトを作成します.元のデータエリアの対象を加えて全部で2つの対象で、私の言うことが正しいかどうか分かりませんが、皆さん教えてください.
もう一人のネットユーザーは「Doulbeにキャッシュがないのに、なぜ?
Doulbe(キャッシュなし)
私もネットで見ました.javaドキュメントのソースコードpublic static Double valueOf(double d){return new Double(d);}コードには確かにIntegerのvalueOfをバッファ対比する方法が使われていないので、違うので、この結論があるのではないでしょうか.
====================================================
 
これらの原理を知った
Javaに関するネット上の面白い質問を見てみると、答えがわかります.
次の私达は1つのネットユーザーの招待状の中の问题に対して解答をして、私もその时この招待状を见てやっとbaiduがこれらの内容を学んだのです
http://xiaoyu1985ban.iteye.com/blog/1384191
テーマ:java迷題:等しいですか、それとも等しくありませんか.
コードクリップ1
public static void main(final String[] args) {  
    Integer a = new Integer(100);  
    Integer b = 100;  
    System.out.println(a == b);   

回答:
結果出力false
new Integer(100)は、再スタックメモリにオブジェクトを作成することを示すため
Integer b=100ですこれは自動梱包です.
得られたのはIntegerバッファの中のオブジェクトで、このコードreturn IntegerCacheです.cache[100 + 128]
明らかにaとbのアドレスは異なり、同じオブジェクトではない
 
コードクリップ2
public static void main(final String[] args) {  
    Integer a = 100;  
    Integer b = 100;  
    System.out.println(a == b);   

回答:
結果出力true
aとbは同じオブジェクトを指し、IntegerCacheである.cache[100 + 128]
 
コードクリップ3
public static void main(final String[] args) {  
    Integer a = 156;  
    Integer b = 156;  
    System.out.println(a == b);   

回答:
結果出力false
156が128より大きいため、パッケージオブジェクトはバッファプールになく、return new Integer(156)を実行する.
newは2回もスタックメモリに入っていますが、アドレスが違います
 
コードフラグメント4
public static void main(final String[] args) {  
    Integer a = Integer.valueOf(100);  
    Integer b = 100;  
    System.out.println(a == b);   
}
回答:
結果出力true
Integer b=100はInteger b=Integerに相当すると述べた.valueOf(100)
したがって、aとbはバッファ内の同じオブジェクトを指す