1. JVM メモリ割り当てと定数プール String クラスを紹介する前に、JVM でメモリがどのように割り当てられるかを簡単に分析してみましょう。次の図に示すように (注: jdk1.8 以降ではメソッド領域はありません)。 前述のように、JVM はメモリを複数の異なる領域に分割します。これらのエリアには、独自の用途、作成および破壊の時期があります。一部の領域は仮想マシン プロセスの開始時に存在しますが、一部の領域はユーザー スレッドの開始と終了に応じて作成および破棄されます。 地域名の説明: 1.1、方法領域: これはデータ共有メモリ領域に属し、クラス情報、定数、静的変数、ジャストインタイムコンパイラによってコンパイルされたコード、および仮想マシンによってロードされたその他のデータが格納されます。 1.2、仮想マシンスタック 仮想マシン スタックは、通常スタックと呼ばれています。 Java 実行メソッドのメモリ モデルです。メソッドが実行されるたびに、スタック フレームが作成されます。スタック フレームはスタックにプッシュされ、Java メソッド呼び出しが通常の結果を返すか例外をキャッチすると、スタック フレームはスタックからポップされます。 スタック フレーム: スタック フレームには、ローカル変数テーブル、戻り値、オペランド スタック、動的リンクなど、メソッドに関連する情報が格納されます。 1.3、ローカルメソッドスタック 機能的には仮想マシン スタックに似ていますが、仮想マシン スタックはバイトコードを実行するのに対し、ローカル メソッド スタックはネイティブ メソッドを呼び出し、スレッド専用です。 1.4、プログラムカウンタ プログラム カウンターはスレッド固有であり、現在のスレッドによって実行されたバイトコードの行番号を記録します。複数のスレッドが実行されると、CPU はスレッド間を切り替えます。では、再びスレッドに戻ったとき、スレッドのストレージ ユニットと実行命令をどのようにして知るのでしょうか。プログラム カウンターは次のストレージ ユニットのアドレスを格納します。実行が完了すると、プログラム カウンターは自動的に 1 増加し、このサイクルはプログラムが終了するまで継続されます。 1.5、ヒープ ヒープの概念といえば、誰もがよく知っているはずです。記憶において重要な役割を果たします。これは主に、キーワード new によって作成されたオブジェクトを格納するために使用され、すべてのスレッドで共有される最大の領域です。 ==特記事項: JDK1.7 以降では、定数プールはヒープ メモリに移動されます。 == ヒープには、コンパイル中に生成されたリテラルとシンボル参照を格納するために使用される定数プールも含まれます。この部分のコンテンツは、クラスがロードされた後にメソッド領域に保存されます。同時に、String クラスの intern() メソッドによって生成される定数など、実行時に生成される新しい定数も定数プールに格納できます。 定数プールは、この型で使用される定数の順序付けられたコレクションです。直接定数 (プリミティブ型、文字列) と他の型、メソッド、フィールドへのシンボリック参照が含まれます。 2. 定数プール 2.1、定数とは何か? 定数は final によって変更される変数です。一度値が決定されると、変更することはできません。 final は静的変数、メソッド、インスタンス変数、ローカル変数を変更できます。 定数プールは、静的定数プールとランタイム定数プールの2つの形式に分かれています。 2.2、静的定数プール つまり、*.class ファイル内の定数プールです。クラス ファイル内の定数プールには、文字列 (数値) リテラルだけでなく、クラスとメソッドの情報も含まれており、クラス ファイルのスペースの大部分を占めています。この定数プールは、リテラルとシンボリック参照を格納するために使用されます。 2.3、ランタイム定数プール これは、JVM 仮想マシンがクラスのロード操作を完了した後、クラス ファイル内の定数プールをメモリにロードし、メソッド領域に保存することを意味します。よく参照される定数プールは、メソッド領域内のランタイム定数プールです。同様に、ランタイム定数プールの重要な特徴はその動的な性質です。つまり、定数はコンパイル時にのみ生成する必要はありません。 String クラスの intern() メソッドなど、新しい定数も実行時に定数プールに保存されます。 3. == とイコール 3.1、両者の境界 ==: 基本型の場合: == は数値比較を示します 参照型の場合: == はアドレス値の比較を意味します 等しい: 比較されるのは、2つの間の値が等しいかどうかですが、Javaのすべてのクラスは直接的または間接的にObjectクラスを継承しており、equalsも例外ではありません。実際、== は、次に示すように、equals ソース コードでの比較にも使用されます。
それで質問は、これと == の違いは何ですか? 前述のように、equals も java.lang.Object から継承されるため、equals を書き換えて独自の比較メソッドを定義することができます。 次のコードを参照してください。
上記の操作結果は次のとおりです。
次に、上記の結果を一つずつ分析します。 1. str1 と str2 は文字列オブジェクトのアドレスを比較します。値は同じなので、アドレス値も同じです。 2. str3 は新しいサンプルオブジェクトです。ヒープメモリ内に新しいメモリアドレスが開かれます。それは一定のプール内にはありません。したがって、返される結果は false になります。 3. 同様に、str2 と str3 を比較すると、同じ結果になります。 4. equals は値が同じかどうかを比較するので、返される結果は true になります。 図に示すように: 4. 一般的な文字列メソッド まず、文字列を宣言します。
4.1、int 長さ()
4.2、char charAt(値)
4.3、char toCharArray()
4.4、int indexOf("文字"); int lastIndexOf("文字")
4.5、文字列の大文字と小文字の変換 大文字に変換します();大文字に変換 小文字に変換();小文字に変換
4.6、String[] 分割("文字")
4.7、ブール値は(Object anObject)に等しい
4.8、文字列トリム()
4.9、文字列の置換
4.10、文字列の部分文字列(int beginIndex、int endIndex)
4.11、ブール型equalsIgnoreCase(文字列)
4.12、ブール値を含む(文字列)
V. 結論 1. JVM メモリの割り当てについて、jdk6 ではメソッド領域がありましたが、jdk8 ではメソッド領域がなくなり、メタ領域に変更されました。 2. jdk6では定数プールはメソッド領域に存在し、jdk7以降では定数プールはヒープへ移動されます。 |
<<: 「テクノロジー+製品+サービス」という新しい製造モデルが業界のバリューチェーンを再構築
>>: クラウド コンピューティング 2.0: ハイブリッド クラウドの新時代
今は、文章よりも写真が注目を集め、写真よりも動画が注目を集める情報化時代です。ソーシャル ネットワー...
[[263438]] 1. ブリッジ: デフォルトでは VMnet0 が使用されます1. 原則:ブリ...
Hostkvm の Global KVM (Yundi International) シリーズの香港...
SWOT 分析法は、企業の確立された内部条件を分析して、企業の強み、弱み、コア競争力を見つけ出す企業...
多くの初心者が SEO を学び始めると、タイトルを変更すると権威が下がったり、追い出されたりするので...
ソーシャル分野における大手インターネット企業間の戦争は、いまだに終わっていない。しかし、数年にわたる...
マルチクラウド コンピューティングとフェデレーテッド ラーニングは、エンタープライズ テクノロジーの...
10月22日から24日まで、国家次世代インターネットエンジニアリングセンターが主催し、南京江北新区...
突然、corgitech の VPS がメモリ (元々の最小サイズは 750M) を無料で提供してい...
Hostshare(ホスト共有組織)は2017年にドメイン名をhostyunに変更し、それから12年...
1. エッジコンピューティングシステムの論理アーキテクチャの概要図 3-1 からわかるように、論理ア...
新しいものを紹介します。serverbound.com は、時間単位で支払う VPS ビジネスです。...
Docker を使用すると、コンテナの再起動が正常に開始されない、つまり docker restar...
少し前、いくつかのメディア記事によってナンシーという女の子が有名になり、WeChat Moments...
moonvm は、henet と APOL データ センターから選択できる台湾の VPS、主に台湾の...