JVM メモリ割り当てと一般的な文字列メソッド

JVM メモリ割り当てと一般的な文字列メソッド

[[275905]]

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 ソース コードでの比較にも使用されます。

  1. ![](https://img2018.cnblogs.com/blog/1655301/201909/1655301-20190902223856542-1095893842.png)

それで質問は、これと == の違いは何ですか?

前述のように、equals も java.lang.Object から継承されるため、equals を書き換えて独自の比較メソッドを定義することができます。

次のコードを参照してください。

  1. 文字列 str1 = "abc" ;
  2. 文字列 str2 = "abc" ;
  3.  
  4. char [] strArray = { 'a' , 'b' , 'c' };
  5. 文字列 str3 = 新しい文字列(strArray);
  6.  
  7. 文字列 str4 = "abc" ;
  8.  
  9. システム。出力.println(str1 == str2);
  10. システム。出力.println(str1 == str3);
  11. システム。出力.println(str2 == str3);
  12. システム。出力.println(str4.equals(str1));

上記の操作結果は次のとおりです。

  1. 真実 
  2. 間違い 
  3. 間違い 
  4. 真実 

次に、上記の結果を一つずつ分析します。

1. str1 と str2 は文字列オブジェクトのアドレスを比較します。値は同じなので、アドレス値も同じです。

2. str3 は新しいサンプルオブジェクトです。ヒープメモリ内に新しいメモリアドレスが開かれます。それは一定のプール内にはありません。したがって、返される結果は false になります。

3. 同様に、str2 と str3 を比較すると、同じ結果になります。

​ 4. equals は値が同じかどうかを比較するので、返される結果は true になります。

図に示すように:

4. 一般的な文字列メソッド

まず、文字列を宣言します。

  1. 文字列 str1 = "abc" ;

4.1、int 長さ()

  1. さ = str1.length();
  2. System.out.println(長さ) ;

4.2、char charAt(値)

  1. 文字列 str = "abc" ;
  2. char c = str.charAt(1);
  3. システム.out.println (c) ;

4.3、char toCharArray()

  1. 文字列 str = "abc" ;
  2. char c[] = str.toCharArray();
  3. ( int i = 0; i < c.length; i++) {
  4. システム。 out .println( "配列出力に変換: " + c[i]);
  5. }

4.4、int indexOf("文字"); int lastIndexOf("文字")

  1. 文字列 str = "axcdefgabc" ;
  2. int a1 = str.indexOf( "a" );
  3. int a2 = str.indexOf( "x" , 2);
  4. int a3 = str.lastIndexOf( "c" );
  5. System.out.println ( "あなたの場所:" + a1);
  6. システム。 out .println( "場所は:" + a2);
  7. システム。 out .println( "ドットの最後の位置は:" + a3);

4.5、文字列の大文字と小文字の変換

​ 大文字に変換します();大文字に変換

​ 小文字に変換();小文字に変換

  1. 文字列 str = "hello world" ;
  2. 文字列 str1 = "HELLO WORD" ;
  3. システム。 out .println( "文字列を大文字に変換します: " + str.toUpperCase());
  4. システム。 out .println( "文字列を小文字に変換します: " + str1.toLowerCase());

4.6、String[] 分割("文字")

  1. 文字列 str = "abc,def,123" ;
  2. 文字列[] arr1 = str.split( "," );

4.7、ブール値は(Object anObject)に等しい

  1. 文字列 str = "abc" ;
  2. 文字列 str1 = "123" ;
  3. if(str.equals(str1)) {
  4. System.out.println ( "等しい" ) ;
  5. }
  6. それ以外{
  7. System.out.println ( "等しくない" );
  8. }

4.8、文字列トリム()

  1. 文字列 str = " abc " ;
  2. システム。 out .println( "左右のスペースを削除した後: " + str.trim());

4.9、文字列の置換

  1. 文字列の置換( char oldChar, char newChar)
  2. String replaceAll(String,String)はすべてのコンテンツを指定されたコンテンツに置き換えます
  3. 文字列repalceFirst(String,String)は、特定のコンテンツの最初の出現を指定されたコンテンツに置き換えます。
  4.  
  5. 文字列 str = "abcdefgabdc" ;
  6. System.out.println ( "置換:" + str.replace ( "abc" , "123" ) );
  7. システム。 out .println( "すべて置換: " + str.replaceAll( "ab" , "12" ));
  8. システム。 out .println( "最初の出現箇所を置き換えます: " + str.repalceFirst( "a" , "a" ));

4.10、文字列の部分文字列(int beginIndex、int endIndex)

  1. 文字列 str = "abcdefg" ;
  2. // 位置 3 を除く位置 0-3 の内容をインターセプトします
  3. システム。 out .println( "インターセプトされた文字は次のとおりです: " + str. substring (0, 3));
  4. // 2を含む3番目の位置からインターセプトを開始します
  5. システム。 out .println( "インターセプト後の文字は次のとおりです: " + str. substring (2));

4.11、ブール型equalsIgnoreCase(文字列)

  1. 文字列 str = "ABC" ;
  2. 文字列 str1 = "abc" ;
  3. if(str.equalsIgnoreCase(str1)){
  4. System.out.println ( "等しい" ) ;
  5. }
  6. それ以外{
  7. System.out.println ( "等しくない" );
  8. }

4.12、ブール値を含む(文字列)

  1. 文字列 str = "ABCDEF" ;
  2. 文字列 str1 = "ABC" ;
  3. if( str.contains (str1)){
  4. システム。 out .println( "str コンテンツに ABC が含まれています" );
  5. }
  6. それ以外{
  7. システム。 out .println( "str に ABC が含まれていません" );
  8. }

V. 結論

​ 1. JVM メモリの割り当てについて、jdk6 ではメソッド領域がありましたが、jdk8 ではメソッド領域がなくなり、メタ領域に変更されました。

​ 2. jdk6では定数プールはメソッド領域に存在し、jdk7以降では定数プールはヒープへ移動されます。

<<:  「テクノロジー+製品+サービス」という新しい製造モデルが業界のバリューチェーンを再構築

>>:  クラウド コンピューティング 2.0: ハイブリッド クラウドの新時代

推薦する

ウェブサイト間の競争は戦略的なレベルにまで高められるべきである

実は、私はよく「ウェブサイトの運営は会社の運営レベル次第」と言います。会社の運営や発展の方向性は、ウ...

エマージェンリサーチ:世界のヘルスケアクラウド市場は2027年までに904.6億ドルに達すると予測

7月27日のニュースによると、Emergen Researchの最新の分析によると、2027年までに...

ウェブサイトの SEO 最適化担当者は、最適化に対する鋭い感覚をどのように養うことができるでしょうか?

ご存知のとおり、ウェブサイトの運用と保守、ウェブサイトの最適化は長期的な仕事です。この作業は、最適化...

検索エンジン入札: ツールを使用して効率的に作業する

インターネット企業にとって、検索エンジン入札広告は重要なマーケティング手法の 1 つになっています。...

テンセントWeiboのトップ10業界のデータ分析を収集して洞察を得る

私は編集業務に1年以上従事していますが、データ収集や分析は一度もしたことがありません。百度や捜狗で検...

マーケティングの基本は顧客との交流を活性化させることである

私自身も小さなビジネスを始めました(誤解を避けるために、ここでは何のビジネスかは言いません)。これま...

Baiduキーワードランキング急落の分析と解決策

編集者のウェブサイト「スマートホームネットワーク」を例に挙げてみましょう最近、BaiduやGoogl...

内部ページは含まれているのに、ホームページが更新されていないのはなぜですか?

内側のページは、最近この問題に遭遇することができませんでしたコンテンツと外部リンクに関して、外部のリ...

草の根ウェブマスターウェブサイトが存在する理由の簡単な分析

実際、ウェブマスターのウェブサイトは、中国でインターネットが出現し、急速に発展し始めた頃に誕生しまし...

エンタープライズSEOでトラフィックを分散させる方法についての簡単な説明

当社は、かなり長い間、企業ウェブサイトの最適化に取り組んできました。企業ウェブサイトの SEO 最適...

マルチクラウドデータガバナンスをより管理しやすく一貫性のあるものにする方法

マルチクラウド環境で運用する組織にとって、データ ガバナンスの複雑さと課題は非常に大きいです。データ...

コールドデータからサイト訪問者の熱意を分析する方法

サイト データの分析は、多くの最適化担当者にとって頭痛の種となるかもしれません。ほとんどの人は、大量...

簡単な議論:新しいモデルにおける口コミマーケティングが中小企業に与える影響

口コミマーケティングはマーケティングモデルの一種であり、ファン経済の延長です。消費者の製品体験に対す...

小紅書を宣伝するための4つの戦略は必ず読んでください

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス現在、小紅書はますます企...

適切なロングテールキーワードを拡張するためのウェブマスター向けの3つのヒント

メインキーワードの選択については、ほとんどのウェブマスターがその方法をご存知でしょう。ただし、ウェブ...