この記事では、Java の定数プールとは何ですか? Java 定数プールの概要には一定の参考価値があります。必要な方は参考にしていただければ幸いです。
Java 仮想マシン jvm では、メモリ配分は次のようになります: 仮想マシン ヒープ、プログラム カウンター、ローカル メソッド スタック、仮想マシン スタック、メソッド領域。
プログラム カウンターは、jvm 実行プログラムのパイプラインであり、いくつかの命令を保存するために使用されます。ローカル メソッド スタックは、jvm オペレーティング システム メソッドによって使用されるスタックです。仮想マシン スタックは、プログラム コードの実行に使用されるスタックで、メソッド領域にクラス変数、クラス情報、メソッド情報、および定数プール (テーブル形式のシンボル参照) が含まれます。 ヒープは、仮想マシンによって使用されるヒープです。プログラムコードを実行します。 ######絶え間ない?これは、値が与えられると変更できない量です。final で変更されたメンバー変数は定数です。
クラス ファイル定数プールとは何ですか?
クラス ファイルには、クラスのバージョン情報、フィールド情報、メソッド、インターフェイスなどの情報があり、また、定数プールも存在することがわかります。これがクラス ファイル定数プールです。
主に保存するために使用されるクラス ファイル定数プールは何ですか?
には、コンパイルによって生成されたさまざまなリテラルとシンボル参照が格納されます。コンピューターサイエンスでは、リテラルはソースコード内の固定値を表現するために使用される表現であり、シンボリック参照は参照先を記述するために使用される一連のシンボルであり、明確に使用できる限り、どのような形式のリテラルでも構いません。ターゲットを見つけます。
定数プールはテーブルの形式で存在します (テーブルはシンボル参照ではなく文字列値を格納するために使用されます)。実際には 2 つのタイプに分類できます。1 つは静的定数プール、もう 1 つは静的定数プールです。は実行時定数プールです。定数プールには 11 個の定数テーブルがあります。定数プール内の各定数はテーブルを表します。
定数テーブル
フラグ値 | 説明 | |
---|---|---|
1 | UTF-8 でエンコードされた Unicode 文字列 | |
3 | int 型のリテラル値 | |
4 | float 型のリテラル値 | #CONSTANT_Long |
long 型のリテラル値 | CONSTANT_Double | |
リテラル値double 型の | CONSTANT_Class | |
クラスまたはインターフェイスへのシンボリック参照 | ##CONSTANT_String | |
String 型のリテラル値への参照 | CONSTANT_Fieldref | |
Yes シンボルフィールドの場合 | CONSTANT_Methodref | |
クラス内のメソッドのシンボルを適用します | CONSTANT_InterfaceMethodref | |
インターフェイス内のメソッドへのシンボリック参照 | CONSTANT_NameAndType | |
Toフィールドまたはメソッドの部分シンボル参照 | # 定数プール Integer integer1 = 127; Integer integer2 = 127; System.out.println(integer1 == integer2); // true Integer integer1 = 128; Integer integer2 = 128; System.out.println(integer1 == integer2); // false ログイン後にコピー Javaでは、アドレスの比較に「==」という記号が使用されます。「等しい」という記号は、デフォルトではアドレスの比較に使用される「==」と同じ記号になります。 String string1 = "dashu"; String string2 = "dashu"; System.out.println(string1==string2); // true ログイン後にコピー String string1 = "dashu"; String string3 = new String("dashu"); System.out.println(string1 == string3); // false ログイン後にコピー String str = new String("dashu"); オブジェクトはいくつ作成されますか? new String("dashu"); では、「dashu」リテラル値が定数プールにすでに存在する場合、オブジェクトは 1 つだけ作成され、そうでない場合は 2 つのオブジェクトが作成されます。 原則: リテラル「dashu」が出現すると、システムは同じ文字列が文字列定数プールに存在するかどうかを確認し、存在する場合は新しいオブジェクトを作成しません。そうでない場合は、リテラルの値を使用します。 「dashu」は String オブジェクトを作成します。 new String("dashu") は、キーワード new を使用して、確実に新しいオブジェクトを作成し、初期化のために String パラメーターを受け取るコンストラクターを呼び出すことを意味します。 string1 == string3.intern() に変更すると、定数プール内のリテラル値のアドレスが返されるため、結果は true になります。 スタック: スレッド スタックとネイティブ メソッド スタック // 源码 public class Object{ private static native void registerNatives(); static{ registerNatives(); } } // 源码 public boolean equals(Object obj){ return (this == obj); } // 源码 public String toString(){ return getClass().getName() + "@" + Integer.toHexString(hasCode()); } // 源码 protected native Object clone() throws CloneNotSupportedException; ログイン後にコピー には、 Object 万物皆对象 // 源码注解 Class {@code Object} is the root of the class hierarchy. Every class has {@code Object} as a superclass. All objects, including arrays, implements the methods of this class. @ see java.lang Class @ since JDK1.0 ログイン後にコピー すべての定数をクラス ファイルに保存する final で変更されたクラス変数を除き、クラス メンバーを初期値に初期化する必要がありますが、最終変数は直接変数値に初期化されますが、クラス メンバーは異なります。 は、シンボル参照を変数 xxx に解析することです。この表現は直接参照になります。これは、一般的な xxx0203r0e などのメモリ アドレスです。 `string1 == string3.intern()` に変更すると、定数プール内のリテラル値のアドレスが返されるため、結果は true になります。 String クラスの intern() メソッドは、定数プールを検索して、equal() に等しい文字列があるかどうかを確認します。 String string1 = "dashu"; String string3 = new String("dashu"); System.out.println(string1==string3.intern()); ログイン後にコピー "dashu" |
以上がJavaの定数プールとは何ですか? Java 定数プールの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。