ホームページ > Java > &#&チュートリアル > Javaの定数プールとは何ですか? Java 定数プールの概要

Javaの定数プールとは何ですか? Java 定数プールの概要

不言
リリース: 2018-09-20 14:40:44
オリジナル
8449 人が閲覧しました

この記事では、Java の定数プールとは何ですか? Java 定数プールの概要には一定の参考価値があります。必要な方は参考にしていただければ幸いです。

Java の定数プール

Java 仮想マシン jvm では、メモリ配分は次のようになります: 仮想マシン ヒープ、プログラム カウンター、ローカル メソッド スタック、仮想マシン スタック、メソッド領域。

Javaの定数プールとは何ですか? Java 定数プールの概要

プログラム カウンターは、jvm 実行プログラムのパイプラインであり、いくつかの命令を保存するために使用されます。ローカル メソッド スタックは、jvm オペレーティング システム メソッドによって使用されるスタックです。仮想マシン スタックは、プログラム コードの実行に使用されるスタックで、メソッド領域にクラス変数、クラス情報、メソッド情報、および定数プール (テーブル形式のシンボル参照) が含まれます。 ヒープは、仮想マシンによって使用されるヒープです。プログラムコードを実行します。 ######絶え間ない?これは、値が与えられると変更できない量です。final で変更されたメンバー変数は定数です。

クラス ファイル定数プールとは何ですか?

クラス ファイルには、クラスのバージョン情報、フィールド情報、メソッド、インターフェイスなどの情報があり、また、定数プールも存在することがわかります。これがクラス ファイル定数プールです。

主に保存するために使用されるクラス ファイル定数プールは何ですか?

には、コンパイルによって生成されたさまざまなリテラルとシンボル参照が格納されます。コンピューターサイエンスでは、リテラルはソースコード内の固定値を表現するために使用される表現であり、シンボリック参照は参照先を記述するために使用される一連のシンボルであり、明確に使用できる限り、どのような形式のリテラルでも構いません。ターゲットを見つけます。

定数プールはテーブルの形式で存在します (テーブルはシンボル参照ではなく文字列値を格納するために使用されます)。実際には 2 つのタイプに分類できます。1 つは静的定数プール、もう 1 つは静的定数プールです。は実行時定数プールです。定数プールには 11 個の定数テーブルがあります。定数プール内の各定数はテーブルを表します。

定数テーブル

定数テーブルの種類CONSTANT_Utf8CONSTANT_IntegerCONSTANT_Float#CONSTANT_Long5long 型のリテラル値CONSTANT_Double6 リテラル値double 型のCONSTANT_Class7クラスまたはインターフェイスへのシンボリック参照89101112
フラグ値 説明
1 UTF-8 でエンコードされた Unicode 文字列
3 int 型のリテラル値
4 float 型のリテラル値
##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"); オブジェクトはいくつ作成されますか?
答えは、2 または 1 です。

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;
ログイン後にコピー

には、JNI 言語または # を通じて c を呼び出すための native 修飾子があります。 ##c が実行されます。

すべてのクラスは

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
ログイン後にコピー

定数プール:

すべての定数をクラス ファイルに保存する
Java では、定数プールは静的定数プールと実行時定数プールの 2 つの形式に分けられると言われています。

静的定数プールは、文字列リテラル、クラス情報、メソッド情報などが含まれるクラス ファイル内の定数プールです。定数プールは、主にクラス ファイルの領域の大部分を占めます。リテラルとシンボル参照。

実行時定数プールは、クラスのロードが完了した後の Java 仮想マシンの操作であり、クラス ファイル内の定数プールをメモリにロードし、それがメソッド領域にあることを確認します。実行中の定数プールは動的であり、実行中に新しい定数を生成してプールに入れることができます。これが上記のコードです。コンパイル中に定数を生成する必要はなく、実行時に新しい出力を生成してプールに入れることもできます。

次の分析:

Java 仮想マシン jvm が特定のクラスを実行するとき、メモリへのロードからアンロードまでクラスを通過する必要があります。

プロセス全体は、ロード、検証、準備、解析、初期化、使用、およびアンインストールです。

ロード、

クラス ファイルのバージョンが現在の Java 仮想マシンのバージョンと互換性があるかどうかを確認し、クラス ファイルが仮想マシンの仕様を満たす必要があります。

準備、何を準備する必要がありますか?

final で変更されたクラス変数を除き、クラス メンバーを初期値に初期化する必要がありますが、最終変数は直接変数値に初期化されますが、クラス メンバーは異なります。

分析、分析とは何ですか?

は、シンボル参照を変数 xxx に解析することです。この表現は直接参照になります。これは、一般的な xxx0203r0e などのメモリ アドレスです。

初期化。変数を初期化するために、静的に変更された変数または静的な静的コード ブロックを使用してコンストラクターを形成します。

使用、

アンインストール

クラスがメモリにロードされると、jvm はクラス定数プールの内容をランタイム定数プールに保存します。定数プール 各クラスに 1 つあります。

クラス定数プールには、リテラルとシンボルへの参照が格納されます。これは、オブジェクトのシンボル参照値です。コンパイル段階で、シンボル参照が直接参照に解析されます。解析後は定数が保存されます。これは直接引用です。次に、各 jvm がグローバル定数プールにコピーを 1 つだけ持つようにし、文字列定数の直接参照値を保存します。

`string1 == string3.intern()` に変更すると、定数プール内のリテラル値のアドレスが返されるため、結果は true になります。


String クラスの intern() メソッドは、定数プールを検索して、equal() に等しい文字列があるかどうかを確認します。

String string1 = "dashu";
String string3 =  new String("dashu");
System.out.println(string1==string3.intern());
ログイン後にコピー
定数プールに

"dashu" リテラルがない場合は、このリテラルの "dashu" 値を最初に定数テーブルに入れます。次に、定数テーブルのアドレスを返します。

コンスタント プールの利点

コンスタント プールは、システム パフォーマンスの低下につながるオブジェクトの頻繁な作成と破棄を回避でき、またオブジェクトの共有を実現してメモリを節約できます。スペースと実行時間。

以上がJavaの定数プールとは何ですか? Java 定数プールの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート