Javaの整数オブジェクトへの参照
Javaにはポインターはありませんが、参照の概念もあります。ここで話したいのは、整数が同じオブジェクトであるかどうかです。
1。最初にコードを見てみましょう:
public static void main(string [] args){integer a1 = 100; integer b1 = a1; //もう片方はb1 = 100フィールドフィールド= nullでもあります。 try {field = a1.getClass()。getDeclaredField( "value"); } catch(nosuchfieldexception e){// todo auto-enerated catch block e.printstacktrace(); } catch(securityexception e){// todo auto-enerated catch block e.printstacktrace(); } field.setAccessible(true); try {field.set(a1、5000); } catch(IllegalargumentException e){// todo auto-enerated catch block e.printstacktrace(); } catch(Illegalaccessexception e){// todo auto-enerated catch block e.printstacktrace(); } system.out.println( "b1 ="+b1);整数C1 = 100; System.out.println( "c1 ="+c1); }結果:
B1 = 5000
C1 = 5000
上記から、まず、ここでいくつかのことを説明したいと思います。
1)整数の場合、-128-127の間の整数が初期化され、整数に配置されています。詰め込まれている場合、オブジェクトはそこから取り込まれます。
2)B1 = A1は数値割り当てですか、それとも同じオブジェクトですか?これは、B1とA1が同じオブジェクトを指している結果から見ることができますが、同じ数値値ではありません
3)C1 = 100は、-128-127の間の値の場合、integercacheから取得されたすべてのオブジェクトを意味します。 100に対応する整数オブジェクトが変更されると、その後の100の梱包が変更されます。キャッシュ内のオブジェクトを取得するとき、数値比較は使用されないため、配列インデックスが使用されるためです。
ただし、このキャッシュの変更はより危険ですので、気にしないでください。誰が100元を梱包するためのJarパッケージまたはプラットフォームを知っていますが、結果は100元ではなく、その時点でクラッシュします。
2。上記の説明を通して、これに変更された場合の答えは何ですか
public static void main(string [] args){integer a1 = 200;整数B1 = A1;フィールドフィールド= null; try {field = a1.getClass()。getDeclaredField( "value"); } catch(nosuchfieldexception e){// todo auto-enerated catch block e.printstacktrace(); } catch(securityexception e){// todo auto-enerated catch block e.printstacktrace(); } field.setAccessible(true); try {field.set(a1、5000); } catch(IllegalargumentException e){// todo auto-enerated catch block e.printstacktrace(); } catch(Illegalaccessexception e){// todo auto-enerated catch block e.printstacktrace(); } system.out.println( "b1 ="+b1);整数C1 = 200; System.out.println( "c1 ="+c1); } 3。その後、変更します
public static void main(string [] args){integer a1 = new Integer(100);整数B1 = A1;フィールドフィールド= null; try {field = a1.getClass()。getDeclaredField( "value"); } catch(nosuchfieldexception e){// todo auto-enerated catch block e.printstacktrace(); } catch(securityexception e){// todo auto-enerated catch block e.printstacktrace(); } field.setAccessible(true); try {field.set(a1、5000); } catch(IllegalargumentException e){// todo auto-enerated catch block e.printstacktrace(); } catch(Illegalaccessexception e){// todo auto-enerated catch block e.printstacktrace(); } system.out.println( "b1 ="+b1);整数C1 = 100; System.out.println( "c1 ="+c1); }答えは何ですか?新しい操作の場合、オブジェクトは箱入りではなく、ヒープで生成されます。
ボクシング、キャッシュ、引用を理解している場合、理解することは難しくありません。自分で試すことができます。
最初に基本的な知識を得ましょう
基本的なタイプとラッパークラスの対応バイトバイト短い短い整数長いフロートフロートダブルチャーキャラクターブールブール
上記の8つの基本データ型の対応は、int-> integer char->文字のみです。 2つの変更は重要であり、残りは最初の文字を小文字に変換するだけです。
JDK5の新機能について学びましょう:自動パッキングとボクシング
自動ボクシング:基本タイプをパッケージングクラスの種類に変換します
自動アンボックス化:ラッパークラスのタイプを基本タイプに変換します
public class demo_integer {public static void main(string [] args){// jdk1.5 int a = 100;整数a1 = new Integer(a); //基本的なデータ型をオブジェクトにラップし、box int b = a1.intvalue(); //オブジェクトを基本データ型に変換し、jdk1.5 int x = 100の後にunbox //整数x1 = x; //自動的にボックス、基本的なデータ型をオブジェクトに変換しますint y = x1 + x; //オブジェクトを自動的に解除して、オブジェクトを基本的なデータ型に変換します}}注意すべきこと
public class demo_integer {public static void main(string [] args){integer a = null; int b = a + 100; //自動アンボクシングの最下層はa.intvalue()、a is nullを呼び出し、aは自然にnullpointerexception system.out.println(b)をスローします。 }}インタビューの質問
public class demo_integer {public static void main(string [] args){integer i1 = new Integer(97);整数i2 = new Integer(97); System.out.println(i1 == i2); System.out.println(i1.equals(i2)); System.out.println( "-------------");整数i3 = new Integer(197); integer i4 = new Integer(197); System.out.println(i3 == i4); system.out.println(i3.equals(i4)); System.out.println( "---------------"); }}出力:false true ------------------------------------------------
理由:
新しいことは、ヒープメモリにスペースを開くことであり、自然な比較アドレス値(==)は偽です。
IntegerはEqualsメソッドを書き換えているため、Equals出力は真です。
上記がポイントではないので、以下のコードを見てください。
public class demo_integer {public static void main(string [] args){integer i1 = 127;整数i2 = 127; System.out.println(i1 == i2); System.out.println(i1.equals(i2)); System.out.println( "-------------");整数i3 = 128;整数i4 = 128; System.out.println(i3 == i4); system.out.println(i3.equals(i4)); System.out.println( "-------------"); }}出力:true true ----------------------------------------------------------------------------------------
理由:
Intが127を超えるのに、なぜ2つのオブジェクトがあるのですか?数字127は非常に馴染みがありますか?
-128〜127はバイトの値範囲です。この値の範囲内にある場合、自動ボクシングは新しいオブジェクトを作成せず、定数プールから取得しません
バイトの値範囲を超えると、新しいオブジェクトが作成されます。
基礎となるレイヤーを自動的にパックし、valueof()メソッド、シンプルなソースコード分析(JDK1.8)を呼び出します。
パブリックファイナルクラスの整数は、数字の実装<<integer> {public static integer valueof(int i){// i> = -128およびi <= 127の場合、バッファ内のオブジェクトが直接取得される場合、(i> = integercache.low && i <= integercache.high] return integercache.cache.cache.新しい整数(i); //バイト値の範囲が範囲を超えた場合、ヒープメモリで作成される場合}静的な最終int high;静的最終整数キャッシュ[]; static {//高い値は、プロパティint h = 127で構成できます。 string integercachehighpropvalue = sun.misc.vm.getSavedProperty( "java.lang.integer.integercache.high"); if(integercachehighpropvalue!= null){try {int i = parseint(integercachehighpropvalue); i = math.max(i、127); //最大配列サイズはinteger.max_value h = math.min(i、integer.max_value-(-low)-1); } catch(numberformatexception nfe){//プロパティをintに解析できない場合は、無視してください。 }} high = h; cache = new Integer [(high -low) + 1]; int j = low; for(int k = 0; k <cache.length; k ++)cache [k] = new Integer(j ++); //範囲[-128、127]は内面化する必要があります(JLS7 5.1.7)Assert IntegerCache.high> = 127; } private integercache(){}}} 8つの基本タイプのラッピングクラスとオブジェクトプール
Javaの基本的なタイプのラッパークラスのほとんどは、定数プーリングテクノロジーを実装しています。これらのクラスは、バイト、ショート、整数、長い文字、ブール、ブール、および浮動小数点数を持つ他の2種類のラッパークラスは実装されていません。さらに、5つの整数ラッパークラスのバイト、短い、整数、長い文字は、対応する値が127以下の場合にのみオブジェクトプールを使用できます。つまり、オブジェクトは127を超えるこれらのクラスのオブジェクトの作成と管理に責任を負いません。
拡張された知識
JVM仕様では、各タイプには独自の一定のプールがあります。一定のプールは、直接定数(プリミティブタイプ、文字列)、および他のタイプ、フィールド、および方法への象徴的な参照を含む、特定のタイプで使用される定数の順序付けられたコレクションです。コンパイル時に他のタイプを直接指定するのではなく、シンボリック参照である理由は、Javaが動的に結合され、実行時にのみ特定のルールに従ってタイプの特定の依存関係インスタンスを決定できるためです。これは、Javaが多型を実装する基礎です。
JVMでは、クラスのライフサイクル全体が、仮想マシンメモリにロードされ、メモリからアンロードされるまで始まります。そのライフサイクル全体には、読み込み、検証、準備、解析、初期化、使用、荷降ろしが含まれます。解析段階は、一定のプールのシンボル参照を直接参照して置き換える仮想マシンのプロセスです。
要約します
上記は、この記事のコンテンツ全体です。この記事の内容には、すべての人の研究や仕事に特定の参照値があることを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。 wulin.comへのご支援ありがとうございます。