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: ハイブリッド クラウドの新時代
何をするにしても、紙の上で話すだけでは無駄です。真実は実践から生まれます。諺にあるように、実践は真実...
最近私が最も注目しているのは、FacebookのIPO問題です。私がFacebookを初めて知り、注...
[[410982]] Red Hat は、コンテナ顧客に必要なトレーニングのせいで、コンテナ ソフト...
lunarpages のメールプロモーションで、大きな国イベントが開催されています。具体的に何なのか...
ホストオンはどうですか?ホストは良いですか? Hosteons の AMD Ryzen+NVMe に...
消費者として、次のような経験をしたことはありませんか。Dangdang.com で 3 年間本を購入...
[[408379]]序文デフォルトのロックロジックは不公平です。ロックが失敗すると、スレッドは wh...
戦争について書面で語ることは軍事戦略においては大きなタブーである。ビジネスは戦場のようなものです。自...
コンテンツ編集は、詩、散文、議論文など、さまざまな形式、または任意の形式を取ることができます。ソフト...
今日のデジタル時代では、あらゆる規模の企業が、ビジネスの効率、柔軟性、リモート アクセス、スケーラビ...
ウェブサイトを運営したりブログを書いたりしている友人の多くが、よく次のような質問をします。「良いソフ...
IPv4 アドレスは枯渇に近づいています。次世代のインターネット技術として歓迎されている IPv6 ...
新しいプランを追加したのですが、ブロードにすると表示されません。精密をオンにしたようなもので、キーワ...
Smarthost がイースター プロモーションを開始しました。ブロック ストレージ VPS を除く...
序文: 昨晩統計をとったとき、実は秘密にしていました。「インターネット マーケティングで最も重要な動...