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: ハイブリッド クラウドの新時代
実は、私はよく「ウェブサイトの運営は会社の運営レベル次第」と言います。会社の運営や発展の方向性は、ウ...
7月27日のニュースによると、Emergen Researchの最新の分析によると、2027年までに...
ご存知のとおり、ウェブサイトの運用と保守、ウェブサイトの最適化は長期的な仕事です。この作業は、最適化...
インターネット企業にとって、検索エンジン入札広告は重要なマーケティング手法の 1 つになっています。...
私は編集業務に1年以上従事していますが、データ収集や分析は一度もしたことがありません。百度や捜狗で検...
私自身も小さなビジネスを始めました(誤解を避けるために、ここでは何のビジネスかは言いません)。これま...
編集者のウェブサイト「スマートホームネットワーク」を例に挙げてみましょう最近、BaiduやGoogl...
内側のページは、最近この問題に遭遇することができませんでしたコンテンツと外部リンクに関して、外部のリ...
実際、ウェブマスターのウェブサイトは、中国でインターネットが出現し、急速に発展し始めた頃に誕生しまし...
当社は、かなり長い間、企業ウェブサイトの最適化に取り組んできました。企業ウェブサイトの SEO 最適...
マルチクラウド環境で運用する組織にとって、データ ガバナンスの複雑さと課題は非常に大きいです。データ...
サイト データの分析は、多くの最適化担当者にとって頭痛の種となるかもしれません。ほとんどの人は、大量...
口コミマーケティングはマーケティングモデルの一種であり、ファン経済の延長です。消費者の製品体験に対す...
ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス現在、小紅書はますます企...
メインキーワードの選択については、ほとんどのウェブマスターがその方法をご存知でしょう。ただし、ウェブ...