この記事では、java に関する関連知識を提供します。主に、文字列の定数プール、文字列の不変性など、文字列クラスに関する関連問題を紹介します。以下の内容を見てみましょう。 . 皆様のお役に立てれば幸いです。
推奨学習: 「java ビデオ チュートリアル 」
まず、JDK の String クラスのソース コードを見てみましょう。多くのインターフェイスが実装されています。String クラスが Final によって変更されていることがわかります。これは、String クラスを変更できないことを意味します。継承され、String のサブクラスはありません。このようにして、JDK を使用する全員が同じ String クラスを使用します。String の継承が許可されている場合、全員が String を拡張できます。全員が異なるバージョンの String を使用し、2 人の異なる人が同じ String クラスを使用しますString クラス。メソッドによって異なる結果が表示されるため、コードの開発が不可能になります。
継承とメソッドのオーバーライドは柔軟性をもたらしますが、サブクラスの動作に一貫性がないという多くの問題も引き起こします
方法 1: 直接代入 (一般的に使用されます)
String str = " hello word "
方法 2: Pass Constructor メソッドでオブジェクトを生成します
String str1 = new String(" hello word ");
方法 3: 文字配列を通じてオブジェクトを生成する
char[] data = new char[]{'a', 'b' ,'c' };
方法 4: String の静的メソッド valueOf (任意のデータ型) = > (一般的に使用される) を使用して文字列に変換する
String str2 = String.valueOf(10 );
リテラル値: 直接書かれた値をリテラル値といいます
10 – > int リテラル値
10.1 --> double リテラル
true --> ブール型リテラル
" abc " – > 文字列リテラル
文字列のリテラルは実際には文字列オブジェクトです
String str = “hello word”;
String str2 = str ;
このとき、これは文字列リテラルであり、文字列オブジェクトでもあるので、わかりやすくするために絵を描きます。実はメソッド領域に
が格納されているのですが、このときstr2 = "Hello"とすれば、" "で囲まれているのでstrの出力には影響しません。文字列オブジェクト。これは、この時点でヒープ上に新しいスペースが開かれていることを意味し、str2 はこの時点で新しいオブジェクトのアドレス スペースを保存します。これは str
参照データ型 == を使用して比較されるのはアドレスです
次の図は、文字列の定数プールに関連する、同じアドレス空間を指す 2 つの参照を示しています
次の図は 2 つのオブジェクトを生成しますおよび 2 つのアドレス スペース、== を使用すると false が返されます
等号の比較は大文字と小文字を区別します
qualsIgnoreCase メソッドは大文字と小文字を区別しない比較です
使用時期直接割り当てメソッドが文字列オブジェクトを生成すると、JVM は文字列定数プールを維持します。オブジェクトがヒープに存在しない場合は、文字列オブジェクトが生成され、文字列定数プールに追加されます。直接割り当てメソッドが引き続き使用される場合は、文字列オブジェクトを生成するとき、JVM は、参照によって指定されたコンテンツが定数プールに既に存在することを検出します。この時点では、新しい文字列オブジェクトは作成されなくなり、既存のオブジェクトが直接再利用されます。これが、次の 3 つの理由です。上図 参照は同じブロックアドレスを指しています
オブジェクトが初めて生成されるとき、定数プールには何もないため、文字列オブジェクトが生成され、定数プールに格納されますオブジェクトが 3 回生成されると、JVM は同じコンテンツが定数プールにすでに存在することを検出するため、新しいオブジェクトを生成せず、str1
プログラムは右から左に実行されますが、このときコードの 1 行目の右側は文字列定数であり、これも文字列ですオブジェクトなので、まず定数プール内のスペースを開き、次に新しいオブジェクトを作成します。文字列オブジェクトが保存され、プログラムは左側で実行されます。新しいキーワードが見つかると、新しいオブジェクトが作成され、ヒープ。次に、str1 はヒープ内のオブジェクトを指します。コードの 2 行目と 3 行目を指すと、定数プールが見つかります。オブジェクトはすでにオブジェクト内に存在しており、再度作成されることはありません。新しいキーワードが見つかった場合、新しいオブジェクトが作成されます。メモリ図は次のとおりです:
String クラスが提供するローカル メソッドであるインターン メソッド:
インターン メソッドを呼び出すと、現在の文字列参照が指すオブジェクトが文字列定数プールに保存されます。状況は 2 つあります:
1. If オブジェクトが現在の定数にすでに存在する場合プールの場合、新しいオブジェクトは生成されず、定数プール内の String オブジェクトが返されます。
2. オブジェクトが現在の定数プールに存在しない場合、オブジェクトはプールに入れられ、プールに返されます。 . 下記アドレスまで。
1. 次のコード行の出力を見てください
インターン メソッドには戻り値があるため、str1 は現時点ではインターン メソッドのみを呼び出し、呼び出しは行いません。戻り値を受け取ります。したがって、str1 は依然としてヒープ内のオブジェクトを指し、str2 は定数プール内のオブジェクトを指しているため、false が返されます。
インターン呼び出しの戻り値である限り、メソッドを受信すると true が返されます;
この時点で、str1 が指すオブジェクトは手動でプールに追加されます。オブジェクトはすでにプールに存在します。str1 にオブジェクトを直接指すようにします。 .
2. 次のコード行を見てください。出力
手動でプールに入ると、プールには何もないため、直接プールに移動されます。定数プール
注: いわゆる文字列の不変性とは、文字列の内容が不変であることを意味します。文字列ではないものは変更できません。
ここでの不変とは、「hello」、「world」、「helloworld」、「!!!」、および結合された「helloworld!!!」を指します。 「これらの既に作成された文字列オブジェクトは、宣言後にその内容を変更することはできませんが、参照は変更できます。1 つは hello を指し、もう 1 つは helloworld を指し、もう 1 つは hello world を指します。 ! ! 、これはすべて可能です
文字列は単なる文字配列です -> char[]、文字列は実際には文字配列に格納されます。文字列の内容を変更できないのはなぜですか?文字列のソースコードを見て調べてみましょう。
String 内の文字配列がカプセル化されていることがわかります。この文字配列は String クラスの外部からアクセスすることはできず、ましてや文字列の内容を変更することはできません
String str = " hello " ;
1. 実行時のリフレクションを通じて値配列のカプセル化を破棄します
2. 代わりに StringBuilder または StringBuffer を使用しますClass - - は型ではなくなりました
a.StringBuilder: スレッド セーフ、強力なパフォーマンス
b.StringBuffer: スレッド セーフ、低パフォーマンス
さらに、2 つのクラスの使用法はまったく同じです。
文字列を頻繁に結合する必要がある場合は、StringBuilder クラスの append メソッドを使用してください。ここではオブジェクトが 1 つだけ生成され、しばらくの間 hello になり、しばらくの間 hello world になります。
StringBuilder クラスと String は 2 つの独立したクラスです。StringBuilder クラスは、文字列の結合の問題を解決するために作成されました。 StringBuilder クラスと String クラス:
その他の一般的に使用されるメソッド:
a. sb;
Java ビデオ チュートリアル」 "
以上がJavaのStringクラスを完全マスターするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。