ホームページ  >  記事  >  Java  >  JavaのStringクラスを完全マスターする

JavaのStringクラスを完全マスターする

WBOY
WBOY転載
2022-05-25 13:41:331659ブラウズ

この記事では、java に関する関連知識を提供します。主に、文字列の定数プール、文字列の不変性など、文字列クラスに関する関連問題を紹介します。以下の内容を見てみましょう。 . 皆様のお役に立てれば幸いです。

JavaのStringクラスを完全マスターする

推奨学習: 「java ビデオ チュートリアル

1. 文字列について理解する

1.JDK 文字列

まず、JDK の String クラスのソース コードを見てみましょう。多くのインターフェイスが実装されています。String クラスが Final によって変更されていることがわかります。これは、String クラスを変更できないことを意味します。継承され、String のサブクラスはありません。このようにして、JDK を使用する全員が同じ String クラスを使用します。String の継承が許可されている場合、全員が String を拡張できます。全員が異なるバージョンの String を使用し、2 人の異なる人が同じ String クラスを使用しますString クラス。メソッドによって異なる結果が表示されるため、コードの開発が不可能になります。
継承とメソッドのオーバーライドは柔軟性をもたらしますが、サブクラスの動作に一貫性がないという多くの問題も引き起こします
JavaのStringクラスを完全マスターする

2. 文字列を作成する 4 つの方法

方法 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 );
JavaのStringクラスを完全マスターする

3. 文字列リテラル値

リテラル値: 直接書かれた値をリテラル値といいます
10 – > int リテラル値
10.1 --> double リテラル
true --> ブール型リテラル
" abc " – > 文字列リテラル
文字列のリテラルは実際には文字列オブジェクトです
String str = “hello word”;
String str2 = str ;
このとき、これは文字列リテラルであり、文字列オブジェクトでもあるので、わかりやすくするために絵を描きます。実はメソッド領域に
JavaのStringクラスを完全マスターする
が格納されているのですが、このときstr2 = "Hello"とすれば、" "で囲まれているのでstrの出力には影響しません。文字列オブジェクト。これは、この時点でヒープ上に新しいスペースが開かれていることを意味し、str2 はこの時点で新しいオブジェクトのアドレス スペースを保存します。これは str
JavaのStringクラスを完全マスターする

# には影響しません。 #4 .String の比較は等しいです

すべての参照データ型が等しいかどうかを比較する場合は、equals メソッドを使用して比較します。JDK でよく使用されるクラスは、equals メソッドをオーバーライドしており、直接使用できます

参照データ型 == を使用して比較されるのはアドレスです
次の図は、文字列の定数プールに関連する、同じアドレス空間を指す 2 つの参照を示しています

JavaのStringクラスを完全マスターする 次の図は 2 つのオブジェクトを生成しますおよび 2 つのアドレス スペース、== を使用すると false が返されます

JavaのStringクラスを完全マスターする 等号の比較は大文字と小文字を区別します

JavaのStringクラスを完全マスターするqualsIgnoreCase メソッドは大文字と小文字を区別しない比較です

JavaのStringクラスを完全マスターする

2. 文字列定数プール

1. 文字列定数プールとは何ですか

JavaのStringクラスを完全マスターする
使用時期直接割り当てメソッドが文字列オブジェクトを生成すると、JVM は文字列定数プールを維持します。オブジェクトがヒープに存在しない場合は、文字列オブジェクトが生成され、文字列定数プールに追加されます。直接割り当てメソッドが引き続き使用される場合は、文字列オブジェクトを生成するとき、JVM は、参照によって指定されたコンテンツが定数プールに既に存在することを検出します。この時点では、新しい文字列オブジェクトは作成されなくなり、既存のオブジェクトが直接再利用されます。これが、次の 3 つの理由です。上図 参照は同じブロックアドレスを指しています
JavaのStringクラスを完全マスターする
オブジェクトが初めて生成されるとき、定数プールには何もないため、文字列オブジェクトが生成され、定数プールに格納されますオブジェクトが 3 回生成されると、JVM は同じコンテンツが定数プールにすでに存在することを検出するため、新しいオブジェクトを生成せず、str1

    と同じアドレス空間を直接ポイントします。

JavaのStringクラスを完全マスターする
プログラムは右から左に実行されますが、このときコードの 1 行目の右側は文字列定数であり、これも文字列ですオブジェクトなので、まず定数プール内のスペースを開き、次に新しいオブジェクトを作成します。文字列オブジェクトが保存され、プログラムは左側で実行されます。新しいキーワードが見つかると、新しいオブジェクトが作成され、ヒープ。次に、str1 はヒープ内のオブジェクトを指します。コードの 2 行目と 3 行目を指すと、定数プールが見つかります。オブジェクトはすでにオブジェクト内に存在しており、再度作成されることはありません。新しいキーワードが見つかった場合、新しいオブジェクトが作成されます。メモリ図は次のとおりです:
JavaのStringクラスを完全マスターする

2. 手動プーリング メソッド

String クラスが提供するローカル メソッドであるインターン メソッド:
JavaのStringクラスを完全マスターする
インターン メソッドを呼び出すと、現在の文字列参照が指すオブジェクトが文字列定数プールに保存されます。状況は 2 つあります:
1. If オブジェクトが現在の定数にすでに存在する場合プールの場合、新しいオブジェクトは生成されず、定数プール内の String オブジェクトが返されます。
2. オブジェクトが現在の定数プールに存在しない場合、オブジェクトはプールに入れられ、プールに返されます。 . 下記アドレスまで。

1. 次のコード行の出力を見てください
JavaのStringクラスを完全マスターする
インターン メソッドには戻り値があるため、str1 は現時点ではインターン メソッドのみを呼び出し、呼び出しは行いません。戻り値を受け取ります。したがって、str1 は依然としてヒープ内のオブジェクトを指し、str2 は定数プール内のオブジェクトを指しているため、false が返されます。
JavaのStringクラスを完全マスターする
インターン呼び出しの戻り値である限り、メソッドを受信すると true が返されます;
JavaのStringクラスを完全マスターする
この時点で、str1 が指すオブジェクトは手動でプールに追加されます。オブジェクトはすでにプールに存在します。str1 にオブジェクトを直接指すようにします。 .
JavaのStringクラスを完全マスターする
2. 次のコード行を見てください。出力
JavaのStringクラスを完全マスターする
手動でプールに入ると、プールには何もないため、直接プールに移動されます。定数プール
JavaのStringクラスを完全マスターする


3. 文字列の不変性

1. 不変である理由

注: いわゆる文字列の不変性とは、文字列の内容が不変であることを意味します。文字列ではないものは変更できません。
JavaのStringクラスを完全マスターする
ここでの不変とは、「hello」、「world」、「helloworld」、「!!!」、および結合された「helloworld!!!」を指します。 「これらの既に作成された文字列オブジェクトは、宣言後にその内容を変更することはできませんが、参照は変更できます。1 つは hello を指し、もう 1 つは helloworld を指し、もう 1 つは hello world を指します。 ! ! 、これはすべて可能です
JavaのStringクラスを完全マスターする
文字列は単なる文字配列です -> char[]、文字列は実際には文字配列に格納されます。文字列の内容を変更できないのはなぜですか?文字列のソースコードを見て調べてみましょう。
JavaのStringクラスを完全マスターする
String 内の文字配列がカプセル化されていることがわかります。この文字配列は String クラスの外部からアクセスすることはできず、ましてや文字列の内容を変更することはできません
String str = " hello " ;
JavaのStringクラスを完全マスターする

2. 文字列の内容を変更する方法

1. 実行時のリフレクションを通じて値配列のカプセル化を破棄します
2. 代わりに StringBuilder または StringBuffer を使用しますClass - - は型ではなくなりました
a.StringBuilder: スレッド セーフ、強力なパフォーマンス
b.StringBuffer: スレッド セーフ、低パフォーマンス
さらに、2 つのクラスの使用法はまったく同じです。

文字列を頻繁に結合する必要がある場合は、StringBuilder クラスの append メソッドを使用してください。ここではオブジェクトが 1 つだけ生成され、しばらくの間 hello になり、しばらくの間 hello world になります。
JavaのStringクラスを完全マスターする

3. StringBuilder クラスの具体的な使用方法

StringBuilder クラスと String は 2 つの独立したクラスです。StringBuilder クラスは、文字列の結合の問題を解決するために作成されました。 StringBuilder クラスと String クラス:

1.StringBuilder は String クラスになり、String メソッドを呼び出します


JavaのStringクラスを完全マスターする

2.String クラスは StringBuilder クラスに変換されます。StringBuilder のコンストラクターを使用するか、追加します。 method


JavaのStringクラスを完全マスターする
JavaのStringクラスを完全マスターする その他の一般的に使用されるメソッド:
a. sb;

JavaのStringクラスを完全マスターする

b によって提供される文字列反転操作 reverse() . 指定した範囲のデータを削除、delete (int start, int end); 最初から最後まですべての内容を削除、左側が閉じ、右側が開きます


JavaのStringクラスを完全マスターする

c. 挿入操作、挿入 (int start、さまざまなデータ型): 開始インデックス位置から挿入を開始します。挿入の開始インデックスは start


JavaのStringクラスを完全マスターする

推奨学習: 「

Java ビデオ チュートリアル」 "

以上がJavaのStringクラスを完全マスターするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。