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: ハイブリッド クラウドの新時代
Raksmart は香港データセンターをアップグレードしました。香港の独立サーバーの帯域幅は最大 1...
過去 2 年間、クラウド コンピューティング市場は急成長を遂げ、この分野は確かに大きな進歩を遂げまし...
私たちが何かの業界に携わるとき、それがウェブサイトのスタートアップであれ、現実のスタートアップであれ...
パブリッククラウドに関しては、金融サービス業界は長年導入を避けてきました。金融サービス業界が新しいテ...
ウェブサイトアナリストは、トレンドとセグメンテーションについてよく話します。いわゆるトレンド分析は、...
Baidu のアルゴリズムは更新されており、ユーザーのニーズも変化しているため、ウェブマスターは外部...
流行の影響を受け、あらゆる分野でコスト削減、効率化、収益増加、支出削減を目指してデジタル変革が加速し...
WholesaleInternet は、カンザスシティのダウンタウンにあるインターネット サービス会...
質問1:iOSチャネルをどこで利用すればよいかわかりません。Androidユーザーは5か月間オンライ...
卒業シーズンがまた近づいてきた。卒業生の大半が就職に苦労する中、華南理工大学を2010年に卒業した張...
キーワードランキングネットワークは、中国のSEO専門家Obsessionによって初めて提案されました...
みなさんこんにちは。梁磊です。百度ウェブマスタープラットフォームで「手を携えてインターネットエコシス...
月収10万元の起業の夢を実現するミニプログラム起業支援プランSEO の仕事をしている友人の多くは、R...
Godaddy の 3 月の最新割引コードでは、com ドメイン名の登録価格は 4.95 米ドルです...
2.4 「Hello World」を出力するまず、新しいアプリケーションで「Hello World」...