1.文字列の特徴
文字列クラス:文字列を表します
文字列は、文字の不変のシーケンスを表す最終クラスです。継承できません
Stringオブジェクトの文字コンテンツは、文字配列value []に格納されます。
ソースコードから、StringクラスがSerializable、Comparable、およびCharSequenceインターフェイスを実装していることがわかります。ComparableはStringのサイズを比較できることを示すために実装され、CharSequenceはStringが一連の文字を操作できることを示すために実装されています。メソッド。すべてのCharSequenceインターフェースはいくつかのメソッドです。
その中で、配列value []もfinalです。配列が割り当てられた後は、配列が確定されているため、アドレスを変更できません。配列を再割り当てしたり、要素値を変更したりすることはできません。これは、文字列がそうではないことを示します。変更可能な文字のシーケンス。
Stringが不変なのはなぜですか?
簡単なコードのデモンストレーションと分析:
import org.junit.Test;
public class StringMain {
@Test
public void test01(){
String str1 = "123";
String str2 = "123";
str1="hello";
System.out.println(str1==str2);
}
}
出力:true
分析:メソッド領域には文字列定数プールが含まれています。異なるjdkでは、除算が異なり、最新のものがヒープ内にあります。
文字列に値を文字通り割り当てます。この時点で、文字列値は文字列定数プールで宣言され、文字列定数プール に同じ内容の文字列はありません。
文字列は最終的な[]値とともに保存されるため、str1には値123が割り当てられます。値helloをstr1に割り当てます。定数プールの123を直接変更する代わりに、helloを再作成します。右前の値を変更します(123)
したがって、不変性を反映します。
1.文字列を再割り当てする場合、割り当て用のメモリ領域を再割り当てする必要があり、元の値を割り当てに使用することはできません。
2.既存の文字列を連結する場合は、割り当て用のメモリ領域も再指定する必要があり、元の値を割り当てに使用することはできません。
3. replace()を呼び出すときに文字を変更する場合は、メモリ領域の割り当ても再指定する必要があります。割り当てに元の値を使用することはできません。
疑問がある場合は、str1のアドレスを確認できます。
import org.junit.Test;
public class StringMain {
@Test
public void test01(){
String str1 = "123";
System.out.println(System.identityHashCode(str1));
String str2 = "123";
str1="hello";
System.out.println(System.identityHashCode(str1));
System.out.println(str1==str2);
final int []value;
}
}
出力内容:
1456208737
288665596
false
文字列オブジェクトの作成
ソースコードのStringオブジェクトの作成のスクリーンショットを表示します。
String str1 = "abc"とStringstr2 = new String( "abc")の違いは何ですか?
newString(str)のソースコードを最初に見てください。
@HotSpotIntrinsicCandidate
public String(String original) {
this.value = original.value;
this.coder = original.coder;
this.hash = original.hash;
}
オブジェクトは新しいメソッドで作成されるため、ヒープ内のスペースを開くことになります。2つの図は次のとおりです。
定数プールに誰もいない場合、1つは再作成され、他は変更されません。
真/偽の質問をもう一度見てください:説明する図を添付してください
まとめ:
1.定数と定数のスプライシング結果は定数プールにあります。そして、定数プールに同じ内容の定数はありません
2.それらの1つが変数である限り、結果はヒープにあります
3.スプライシングの結果がintern()メソッドを呼び出す場合、戻り値は定数プールにあります
2.一般的に使用される文字列メソッド
メソッドのプロトタイプ | 意味機能 |
int length() | 文字列の長さを返します |
char charAt(int index) | インデックスの文字を返します |
ブールisEmpty() | 空の文字列かどうかを判断します |
文字列toLowerCase() | 文字列内のすべての文字を小文字に変換します |
文字列toUpperCase() | 文字列内のすべての文字を大文字に変換します |
文字列trim() | 前後の空白を無視して、文字列のコピーを返します |
boolean equals(Object obj): | 文字列の内容が同じかどうかを比較します |
boolean equalsIgnoreCase(String anotherString) | equalsメソッドと同様ですが、大文字と小文字は区別されません |
文字列concat(文字列str) | 指定された文字列をこの文字列の末尾に連結します。「+」を使用するのと同じです |
int compareTo(String anotherString) | 2つの文字列のサイズを比較します |
文字列部分文字列(intbeginIndex) | 新しい文字列を返します。これは、beginIndexから最後までインターセプトされるこの文字列の部分文字列です。 |
文字列部分文字列(int beginIndex、int endIndex) | この文字列のbeginIndexからendIndexまでの部分文字列である新しい文字列を返します(含まれていません) |
ブール値endsWith(文字列サフィックス) | この文字列が指定されたサフィックスで終わるかどうかをテストします |
ブールstartsWith(文字列プレフィックス) | この文字列が指定されたプレフィックスで始まるかどうかをテストします |
ブールstartsWith(String prefix、int toffset) | 指定されたインデックスから始まるこの文字列の部分文字列が指定されたプレフィックスで始まるかどうかをテストします |
ブール値contains(CharSequence s) | この文字列に指定されたchar値のシーケンスが含まれている場合にのみtrueを返します |
int indexOf(String str) | この文字列で指定された部分文字列が最初に出現するインデックスを返します |
int indexOf(String str、int fromIndex) | 指定されたインデックスから開始して、この文字列内で指定された部分文字列が最初に出現するインデックスを返します |
int lastIndexOf(String str) | この文字列内の指定された部分文字列の右端の出現のインデックスを返します |
int lastIndexOf(String str、int fromIndex) | この文字列内で最後に出現した指定された部分文字列のインデックスを返し、指定されたインデックスから逆方向に検索します |
文字列replace(char oldChar、char newChar) | この文字列内のすべてのoldCharオカレンスをnewCharに置き換えることによって取得される新しい文字列を返します |
文字列replaceAll(文字列正規表現、文字列置換) | 指定された正規表現に一致するこの文字列のすべての部分文字列を置き換えるには、指定された置換を使用します。 |
ブール一致(文字列正規表現) | この文字列が指定された正規表現と一致するかどうかを確認します。 |
String [] split(String regex) | 指定された正規表現の一致に従ってこの文字列を分割します |
indexOfメソッドとlastIndexOfメソッドはどちらも、見つからない場合は-1を返します。
3.文字列と基本的なデータ型の変換
1、基本的なデータ型へ の文字列、パッケージ化
1)Integerラッパークラスのpublic static int parseInt(String s ):「デジタル」文字で構成される文字列を整数に変換できます。
2)同様に、java.langパッケージのByte、Short、Long、Float、およびDoubleクラスを使用して、対応するクラスメソッドを調整し、「デジタル」文字で構成される文字列を対応する基本データ型に変換します。
2、基本的なデータ型、および文字列へのパッケージ化
调用String类的public String valueOf(int n)可将int型转换为字符串 valueOf(byte b)、valueOf(long l)、valueOf(float f)、valueOf(double d)、valueOf(boolean b)可由参数的相应类型到字符串的转换。
3、字符数组 转为 字符串
String 类的构造器:String(char[]) 和 String(char[],int offset,int length) 分别用字符数组中的全部字符和部分字符创建字符串对象
4、字符串 转为 字符数组
public char[] toCharArray():将字符串中的全部字符存放在一个字符数组 中的方法