Stringクラスは、部分文字列を検索および抽出するためのさまざまなメソッドを提供します。一般的に使用される方法は次のとおりです。
// 是否包含子串:
"Hello".contains("ll"); // true
部分文字列を検索
例:
"Hello".indexOf("l"); // 2
"Hello".lastIndexOf("l"); // 3
"Hello".startsWith("He"); // true
"Hello".endsWith("lo"); // true
部分文字列を抽出します
例:
"Hello".substring(2); // "llo"
"Hello".substring(2, 4); "ll"
部分文字列を置き換える
文字列内の部分文字列を置き換えるには、2つの方法があります。1つは、文字または文字列の置換に基づいています。
String s = "hello";
s.replace('l', 'w'); // "hewwo",所有字符'l'被替换为'w'
s.replace("ll", "~~"); // "he~~o",所有子串"ll"被替换为"~~"
分割文字列
文字列を分割するには、split()メソッドを使用すると、正規表現も次のように渡されます。
String s = "A,B,C,D";
String[] ss = s.split("\\,"); // {"A", "B", "C", "D"}
連結された文字列
文字列を連結するには、静的メソッドjoin()を使用します。このメソッドは、文字列配列を指定された文字列に接続します。
String[] arr = {
"A", "B", "C"};
String s = String.join("***", arr); // "A***B***C"
フォーマット文字列
この文字列は、formatted()メソッドとformat()静的メソッドを提供します。他のパラメーターを渡し、プレースホルダーを置き換えてから、新しい文字列を生成できます。
public class Main {
public static void main(String[] args) {
String s = "Hi %s, your score is %d!";
System.out.println(s.formatted("Alice", 80));
System.out.println(String.format("Hi %s, your score is %.2f!", "Bob", 59.5));
}
}
いくつかのプレースホルダーがあり、いくつかのパラメーターは後で渡されます。パラメータタイプは、プレースホルダーと一致している必要があります。この方法を使用して情報をフォーマットすることがよくあります。一般的に使用されるプレースホルダーは次のとおりです。
%s:文字列を表示します;
%d:整数を表示します;
%x:16進整数を表示します;
%f:浮動小数点数を表示します。
プレースホルダーもフォーマットできます。例:%。2fは、小数点以下2桁を表示することを意味します。使用するプレースホルダーがわからない場合は、常に%sを使用してください。%sは任意のデータ型を表示できるためです。
型変換
基本型または参照型を文字列に変換するには、静的メソッドvalueOf()を使用できます。これはオーバーロードされたメソッドであり、コンパイラーはパラメーターに従って適切なメソッドを自動的に選択します。
String.valueOf(123); // "123"
String.valueOf(45.67); // "45.67"
String.valueOf(true); // "true"
String.valueOf(new Object()); // 类似java.lang.Object@636be97c
文字列を他のタイプに変換するには、状況に基づいている必要があります。たとえば、文字列をint型に変換するには、次のようにします。
int n1 = Integer.parseInt("123"); // 123
int n2 = Integer.parseInt("ff", 16); // 按十六进制转换,255
文字列をブール型に変換します。
boolean b1 = Boolean.parseBoolean("true"); // true
boolean b2 = Boolean.parseBoolean("FALSE"); // false
IntegerにはgetInteger(String)メソッドがあることに特に注意してください。このメソッドは、文字列をintに変換しませんが、文字列に対応するシステム変数を整数に変換します。
Integer.getInteger("java.version"); // 版本号,11
文字列と文字の間で変換する
char[] cs = "Hello".toCharArray(); // String -> char[]
String s = new String(cs); // char[] -> String
char []配列が変更された場合、文字列は変更されません。
public class Main {
public static void main(String[] args) {
char[] cs = "Hello".toCharArray();
String s = new String(cs);
System.out.println(s);
cs[0] = 'X';
System.out.println(s);
}
}
両方の結果は次のとおりです。
こんにちは
こんにちは
これは、new String(char [])を介して新しいStringインスタンスが作成されると、渡されたchar []配列を直接参照せずにコピーを作成するためです。したがって、外部char []配列を変更しても影響はありません。これらは2つの異なる配列であるため、Stringインスタンス内のchar []配列。
Stringの不変性の設計から、着信オブジェクトが変更される可能性がある場合は、直接参照するのではなく、コピーする必要があることがわかります。
たとえば、次のコードは、学生のグループのスコアを格納するスコアクラスを設計します。
public class Main {
public static void main(String[] args) {
int[] scores = new int[] {
88, 77, 51, 66 };
Score s = new Score(scores);
s.printScores();
scores[2] = 99;
s.printScores();
}
}
class Score {
private int[] scores;
public Score(int[] scores) {
this.scores = scores;
}
public void printScores() {
System.out.println(Arrays.toString(scores));
}
}
[88、77、51、66]
[88、77、99、66]
出力を2回観察すると、Scoreは外部から渡されたint []配列を直接参照するため、外部コードがint []配列を変更し、Scoreクラスのフィールドに影響を与えます。外部コードが信頼できない場合、これはセキュリティリスクを引き起こします。
外部コードによる配列の変更がScoreインスタンスのint []フィールドに影響を与えないように、Scoreの構築方法を修正してください。