Javaの知識ポイントの要約[4]文字列

1.文字列の作成

1)文字列str1 = "hello"; 

2)文字列str2 = new String( "hello"); 

3)char []またはbyte []で文字列を作成します

char[] arr={'h','e','l','l','o'};
String str3=new String(arr);

なかでも最初の方法が最も一般的ですが、実は上記の3つだけでなく、作成方法もたくさんありますので、必要に応じてチェックしてみてください〜

2.文字列の比較は等しい

1)==オブジェクトIDを比較します(2つの参照に保存されているアドレスが同じかどうかを比較します/ 2つの参照が同じオブジェクトを指しているかどうかを比較します)

例①

String str1="hello";
String str2="hello";
System.out.println(str1==str2);

結果

分析:

「hello」のように、文字列リテラル定数は、行上の定数プールhelloの場所を直接参照する時間内の文字列定数プールの存在であり、コピーを保存できます。メモリに2回保存する必要はありません。したがって、str1とstr2の上の2つの参照は、実際には同じhelloオブジェクトを指しているため、==オブジェクトのIDを比較した後、結果はtrueになります。

例②

String str1=new String("hello");
String str2=new String("hello");
System.out.println(str1==str2);

結果

分析:

上記のコードでは、newキーワードを使用して2つのオブジェクトを作成し、str1とstr2がそれぞれこれらの2つのオブジェクトを指すようにします。異なるオブジェクトを指しているため、==比較の結果はfalseです。

また、文字列を作成するための直接割り当て方法の方が効率的であることがわかります。同じ内容の文字列が複数回引用される場合、それほど多くのオブジェクトを使用する必要はありません。1つの文字列定数プールで十分です。

2)equalsメソッドは、2つの文字列内容を比較します(文字列型の場合のみ)

String str1=new String("hello");
String str2=new String("hello");
System.out.println(str1.equals(str2));//也可写成str2.equals(str1)

結果は本当です

System.out.println(str1.equals("hello"));
System.out.println("hello".equals(str1));

上記の2つの方法のうち、2番目の方法を作成することをお勧めします。str1は最初の型の参照型の変数であるため、null参照型を逆参照することはできません。str1がnull参照になると、例外がスローされ、リテラル定数にはこの問題は含まれません。

3.文字列定数プール

プールは重要な考え方であり、頻繁に使用するオブジェクトを事前に作成して保存するため、いつでも使用できるため、オーバーヘッドが削減され、効率が向上します。

4.Stringオブジェクトの内容を文字列定数プールに追加します

使用インターン方法を

例:

String str1=new String("hello");
System.out.println("hello"==str1);
String str2=new String("hello").intern();
System.out.println("hello"==str2);

結果

分析:

定数プールは、JVMで分割されたメモリ領域です。JVMが実行されると、定数プール(ヒープの一部でもある)と呼ばれる領域に特化します。

上記のコードでは、intern()メソッドが呼び出されると、現在の文字列の内容が文字列定数プールで検索され、定数プールに存在するかどうかが確認されます。存在する場合、プール内のアドレスは直接になります。返されます。存在しない場合は、現在の文字列の内容が定数プールに追加され、プール内のアドレスが返されます。

5.文字列は不変です

String配列に保持されているchar []値配列の内容は、カプセル化の現れであるクラスの外部で変更することはできません。

利点:

1)プールに入れるのに便利

2)hashCodeも変更できません

3)スレッドセーフがより保証されます

6.リフレクションメカニズムを使用して文字列のコンテンツを変更します

上で述べたように、文字列は不変のオブジェクトです。文字列を変更したい場合は、新しいオブジェクトを作成するだけです。

ただし、リフレクションメカニズムを使用してStringのコンテンツを変更する特別な方法もあります。ドアをノックしても絶対にドアを開けませんが、おじさんが事件を処理するのであれば、侵入は合法です〜

リフレクションは、オブジェクト指向プログラミングの重要な機能です。

反射とカプセル化は反対です。

1)リフレクションを使用すると、パッケージが破損することがよくあります

2)反映されたコードはより複雑で、エラーが発生しやすい

3)リフレクションは、コンパイラ自体のいくつかのチェックおよび検証メカニズムを犠牲にし、プログラマーがコードの正確さを手動で確認する必要があります。

7.文字配列、バイト配列、および文字列間の相互変換

文字配列/バイト配列—>文字列:上記の文字列を作成する3番目の方法〜、toString()メソッド

文字列—>文字配列:toCharArray

文字列—>バイト配列:getBytes

例:

//字符数组/字节数组—>字符串
    char[] arr1={'a','b','c'};
    String str1=new String(arr1);
//字符串—>字符数组
    String str2="hello";
    char[] arr2=str2.toCharArray();
//字符串—>字节数组
    String str3="hello";
    byte[] arr3=str3.getBytes();

 

8.文字列比較サイズ

1)大文字と小文字は無視されず、結果は数値になります:compareTo()メソッドを使用します

String a="Hello";
String b="hello";
System.out.println(a.compareTo(b));

結果

分析:

Unicode比較によると、最初の文字が最初に比較され、最初の文字が等しい場合は次の文字が続行されます。a> bは0より大きい数値を返し、a <0は0より小さい数値を返します。a== b 0を返します

上記のコードでは、大文字のHは小文字のhよりも明らかに小さいため(ASCLLコードテーブルで確認できます)、返される数値は<0です。

2)ケースを無視すると、結果は数値になります:compareToIgnoreCase()メソッドを使用します

String a="Hello";
String b="hello";
System.out.println(a.compareToIgnoreCase(b));

結果

分析:

上記の規則と同じですが、大文字と小文字が無視される点が異なります。つまり、大文字のHと小文字のhは同じサイズであり、2つの文字列は同じサイズであるため、0が返されます。

3)大文字と小文字を区別せず、結果はブール型になります:equalsIgnoreCase()メソッドを使用します

String a="Hello";
String b="hello";
System.out.println(a.equalsIgnoreCase(b));

結果

分析:

大文字と小文字を区別しない場合、2つの文字列の各文字は同じサイズであるため、trueを返します

9.文字列に含まれるもの

contains()メソッドを使用すると、結果はブール型になります

String a="Hello world java";
String b="java";
System.out.println(a.contains(b));

結果

注意:

上記のコードを例にとると、a.contains(b)は、文字列にb文字列が含まれているかどうかを調べます。反転して記述できない場合、結果は異なります。

10.部分文字列の添え字開始位置

1)左から右の部分文字列を見て、見つかった場合は、最初に出現した場所のインデックスを返します。indexOf()メソッドを使用します。

String a="Hello java java";
String b="java";
System.out.println(a.indexOf(b));

結果

2)右から左に部分文字列を検索し、インデックスが戻り位置の最初の出現を検索する場合:lastIndexOf()メソッドを使用します

String a="Hello java java";
String b="java";
System.out.println(a.lastIndexOf(b));

結果

11.文字列がXXXで開始/終了することを確認します

1)判断はXXXで始まりますstartWith()メソッドを使用し、返される結果はブール型です

使用法:ネットワークプログラミングで、リンクのプロトコルタイプを決定します

String a="https://www.baidu.com";
String b="https://";
System.out.println(a.startsWith(b));

結果

2)XXXで終了するかどうかを判断します:endsWith()メソッドを使用すると、結果はブール型になります

使用法:ファイルの種類を判別する

String a="a.java";
String b=".java";
System.out.println(a.endsWith(b));

結果

12.弦の交換

1)すべての部分文字列に表示される文字列を置換しますreplaceAll()メソッドを使用します

String a="Hello world world";
String b="world";
System.out.println(a.replaceAll(b,"java"));

結果

2)文字列内の最初に出現する部分文字列を置き換えます。replaceFrist()メソッドを使用します

String a="Hello world world";
String b="world";
System.out.println(a.replaceFirst(b,"java"));

結果

13.文字列分割

split()メソッドを使用する

例①スペースで分割

String a="Hello world java";
String[] result=a.split(" "); //分割符为空格
for(String x:result){
    System.out.println(x);
}

結果

例②。を押して分割します

String a="Hello.world.java";
String[] result=a.split("\\.");
for(String x:result){
    System.out.println(x);
}

結果

分析:

によると、除算の前にさらに2つの円記号\\があることがわかります。

Regexは正規表現の略です。正規表現には多くの特殊記号があります。「。」もその1つです。この問題を解決するには、「正規表現」、つまり正規表現でエスケープ文字を使用する必要があります。は特殊記号として扱われ、「\。」はそれ自体として扱われます。次に、Javaの文字列は、\をJavaのエスケープ文字と見なします。元の\を表すには、\を再度エスケープする必要があります。最終的には「\\」。

一般に、a.split( "\\。");には2つのエスケープが含まれます。1つはJavaでのエスケープで、もう1つは正規表現でのエスケープです。

14.文字列の傍受

substring()メソッドを使用する

1)閉じてから開く前に、間隔[開始、終了)をインターセプトします

String a="Hello world java";
System.out.println(a.substring(6,11));

結果

2)特定の位置(この位置を含む)から傍受を開始します

String a="Hello world java";
System.out.println(a.substring(6));

結果

15.その他

1)左右の空白文字を削除します:trim()メソッドを使用します

String a="    Hello world  ";
System.out.println("["+a.trim()+"]");

結果

注:空白には、スペース、改行、キャリッジリターン、タブ、ページめくり、垂直タブが含まれます。

2)

  • toUpperCase()//小文字を大文字に変換
  • toLowerCase()//大文字から小文字
  • intern()//プールへの文字列
  • concat()//「+」と同等の文字列スプライシング
  • isEmpty()//空白の文字列かどうかを判断します

16.StringBuffer和StringBuilder

StringBuffer、StringBuilder、Stringは異なるクラスです。前述のように、String型によって作成された変数の内容は、特別なメソッド(リフレクションメカニズム)が使用されない限り不変です。ただし、文字列の変更を容易にするために、StringBufferクラスとStringBuilderクラスが導入されています。つまり、これら2つのクラスによって作成された変数が指すコンテンツを変更できます。

①文字列の最後でスプライシング:append()メソッドを使用します

 

StringBuffer str=new StringBuffer("hello");
for(int i=0;i<5;i++){
    str.append(i);
}
System.out.println(str);

結果

分析:append()メソッドは、パラメーターを元のメモリの最後に直接スプライスすることです。スプライスされたコンテンツが多すぎてメモリの範囲を超える場合、strは自動的に拡張されます。

②文字列反転:reverse()メソッドを使用します

StringBuffer str=new StringBuffer("hello");
System.out.println(str.reverse());

結果

③指定した添え字範囲の部分文字列を削除します。delete ()メソッドを使用します。範囲は[begin、end)で、閉じてから開きます。

StringBuffer str=new StringBuffer("Hello,java,world");
System.out.println(str.delete(6,11));

結果

④指定した場所にデータを挿入する:insert()メソッドを使用する

StringBuffer str=new StringBuffer("Hello rld");
System.out.println(str.insert(6,"wo"));

結果

StringBuiderとStringBufferを要約すると:

2つのクラスの関連する操作はそれほど違いはありません。上記はStringBufferクラスの操作の例です。

主な違い:StringBuilderスレッドは安全ではありません、StringBufferスレッドは安全です

おすすめ

転載: blog.csdn.net/weixin_43939602/article/details/112851312