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: ハイブリッド クラウドの新時代
spartanhost の KVM ベースの VPS が現在 20% オフで販売されています。Vir...
中国の新興企業であるaccloudsは、主にKVM仮想化ベースのVPSを運営しています。現在は、日本...
(画像の空白部分はコード化されています) Ars Technica によると、ハッカーは 453,4...
今日では、ターゲット顧客が製品を購入する際、オンラインで関連情報を確認します。主な目的は明らかで、関...
検索エンジンのアルゴリズムが継続的に改善され、インテリジェンスが深まるにつれて、ますます多くの最適化...
hostwindsはどうですか?オランダのhostwindsはどうですか? Hostwinds は、...
現在、App Store のアプリ数は 180 万に達しており、数万のアプリの中から目立つことはもは...
これは私の現在の職場のウェブサイトです。主にコンピューターのトレーニングを行っています。幸いなことに...
最近、ビリビリがIPOの目論見書を発表し、2D動画サイトとしてスタートしたこの集中砲火動画サイトが、...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています多くの伝統...
高リソースの VPS にあまりお金をかけたくない場合は、次の 2 つの VPS が適している可能性が...
外部リンクの数は、ウェブマスターにとって常に最も悩ましいデータです。外部リンクが多いと、外部リンクが...
量子コンピュータは、従来のコンピュータよりも少ないエネルギーで、より効率的な技術を開発する方法を提供...
大人気ドラマ「お父さん、どこへ行くの?」の第1シーズンが終了しました。まだ満足はしていませんが、映画...