私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
皆さんもC言語を勉強していた時に文字列に触れたことがあると思いますが、C言語では文字列しか使えません。
文字配列 char[10] str = “hello”; または文字ポインタ char *str = “hello”;専用の String クラスは提供されません 。オブジェクト指向 Java では、プログラマにとって使いやすい String クラスとその操作が特別に提供されています。
文字列の内容は変更できません。
String では、文字列の内容を変更する可能性を伴うすべての操作で新しいオブジェクトが作成され、変更されるのは新しいオブジェクトです。
たとえば、部分文字列を検索する場合は次のようになります。
「文字列は不変である。その理由は、その中に文字を格納している配列がfinalによって変更され、したがって変更できないからである」という人もいます。
public static void main(String[] args) {
final char[] arr = {'h','e','l','l','o'};
arr[0] = 'H';
System.out.println(String.valueOf(arr));//Hello
// arr = new char[]{'h','o'};Error
}
String は参照データ型であり、文字列自体は保存されません。
public class Test {
public static void main(String[] args) {
//1.直接赋值
String s1 = "first";
//2.new 对象
String s2 = new String("second");
//3. 创建字符数组
char[] arr = {'t','h','i','r','d'};
String s3 = new String(arr);
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
}
知らせ:
文字列 s1 = “first”;
Java 仮想マシン (JVM) はまず、文字列「first」が文字列定数プールにすでに存在するかどうかを確認します。存在する場合は、定数プール内の文字列の参照が直接返され、存在しない場合は、文字列が定数プールに追加され、定数プール内のその参照が返されます。
//s1 s2 分别是new 一个新的字符串"hello"
String s1 = new String("hello");
String s2 = new String("hello");
String s3 = "Hello";
String s4 = s1;
System.out.println(s1 == s2);//false
System.out.println(s1 == s4);//true
System.out.println(s1 == s3);//false
//因为Object类中的equals()方法是==实现的,完成不了String类的需求,
//所以String对equals()实现了重写
String s1 = new String("hello");
String s2 = new String("hello");
String s3 = "Hello";
String s4 = s1;
System.out.println(s1.equals(s2));//true
System.out.println(s1.equals(s4));//true
System.out.println(s1.equals(s3));//false
3. CompareTo() は辞書編集順に比較し、戻り値は int です。
/*
* 比较的方式有一下两种:
* 1.先一个一个字符相比较,如果出现不同的字符,则返回差值
* 2.如果前x个字符相等,则返回两个字符串的长度差值
* */
String s1 = new String("abc");
String s2 = new String("abcdef");
String s3 = new String("abd");
String s4 = new String("abc");
System.out.println(s1.compareTo(s2));//-3 (3-6)
System.out.println(s1.compareTo(s3));//-1
System.out.println(s1.compareTo(s4));//0
String s1 = new String("Abc");
String s2 = new String("aBcdef");
String s3 = new String("aBd");
String s4 = new String("ABc");
System.out.println(s1.compareToIgnoreCase(s2));//-3 (3-6)
System.out.println(s1.compareToIgnoreCase(s3));//-1
System.out.println(s1.compareToIgnoreCase(s4));//0
方法 | 関数 |
---|---|
char charAt(int インデックス) | インデックス位置の文字を返します。インデックスが負の場合、または範囲外の場合、IndexOutOfBoundsException 例外がスローされます。 |
int インデックス(int ch) | -1 を返さずに、ch が最初に出現する位置を返します。 |
int インデックス(int ch, intfromIndex) | fromIndex の位置から開始して ch が最初に出現する位置を検索し、-1 を返します。 |
int インデックス(文字列 str) | -1 を返さずに、str が最初に出現する位置を返します。 |
int indexOf(文字列 str, intfromIndex) | -1 を返さずに、fromIndex 位置から始まる最初の str を検索します。 |
int lastIndexOf(int ch) | 後ろから前に検索し、最初に ch が出現する位置に戻り、見つからない場合は -1 を返します。 |
int lastIndexOf(int ch, intfromIndex) | fromIndex の位置から検索を開始し、最初に ch が出現する位置を後ろから前に検索します。-1 は返されません。 |
int lastIndexOf(文字列 str) | 後ろから前に検索し、str が最初に出現する位置を返します。-1 は返されません。 |
int lastIndexOf(文字列 str, intfromIndex) | fromIndex の位置から検索を開始し、最初に str が出現する位置を後ろから前に検索します。No -1 が返されます。 |
public static void main(String[] args) {
String s = "Hello, how are you today?";
System.out.println(s.charAt(2)); //l
System.out.println(s.indexOf('H')); //0
System.out.println(s.indexOf('l',2)); //从第二个开始找 2
System.out.println(s.indexOf("are")); //11
System.out.println(s.indexOf("are",12)); // 未找到-1
System.out.println(s.lastIndexOf('l')); //从后往前数 3
System.out.println(s.lastIndexOf('l',3));// 从第三个往后数 3
System.out.println(s.lastIndexOf("how"));// 7
System.out.println(s.lastIndexOf("how",6));// 未找到 -1
}
1. 数値と文字列の変換
String s1 = String.valueOf(1234);
String s2 = String.valueOf(12.34);
String s3 = String.valueOf(true);
String s4 = String.valueOf(new Student("Hanmeimei", 18));
System.out.println(s1);//1234 String
System.out.println(s2);//12.34 String
System.out.println(s3);//true String
System.out.println(s4);//Student@1b6d3586
System.out.println("=================================");
int data1 = Integer.parseInt("1234");
double data2 = Double.parseDouble("12.34");
System.out.println(data1);//1234
System.out.println(data2);//12.34
2. 大文字と小文字の変換
String s1 = "hello";
String s2 = "HELLO";
System.out.println(s1.toUpperCase());//HELLO
System.out.println(s1.toLowerCase());//hello
3. 文字列から文字配列へ、および文字配列から文字列へ
//字符串转字符数组
String s = "What can I say!";
char[] arr = s.toCharArray();
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
System.out.println();
//字符数组转字符串
String s1 = new String(arr);
System.out.println(s1);
4.フォーマットする
//格式化
String s = String.format("%d/%02d/%d",2024,07,10);
System.out.println(s);//2024/07/10
方法 | 関数 |
---|---|
文字列replaceAll(文字列正規表現、文字列置換) | 指定されたすべてのコンテンツを置き換えます |
文字列replaceFirst(文字列正規表現、文字列置換) | 最初のコンテンツを置き換える |
String s = "What can I say say!";
System.out.println(s.replaceAll("say","look"));
System.out.println(s.replaceFirst("say","SAY"));
//What can I look look!
//What can I SAY say!
方法 | 関数 |
---|---|
String[] 分割(文字列正規表現) | すべての文字列を分割する |
String[] 分割(文字列正規表現、int 制限) | 指定された形式で文字列を制限グループに分割します。 |
//字符串拆分
String s = "字 符 串 拆 分";
String[] str = s.split(" ");
for(String i : str) {
System.out.print(i+"|");
}
System.out.println();
String[] str2 = s.split(" ",2);
for(String i : str2) {
System.out.println(i);
}
/*
* 输出:
字|符|串|拆|分|
字
符 串 拆 分
* */
/*
*拆分是特别常用的操作:
* 一定要重点掌握
*另外有些特殊字符(通配符)作为分割符可能无法正确切分, 需要加上转义.
* */
String s2 = "192.168.1.16" ;
String[] result = s2.split("\.") ;
for(String i: result) {
System.out.println(i);
}
System.out.println("\");
//为了匹配字面上的点号,你需要使用反斜杠()来转义它,
// 但在Java字符串中,反斜杠本身也是一个转义字符,
// 所以你需要使用双反斜杠(\)来表示一个字面量上的反斜杠。
//字符串截取
String s = "What can I say!";
System.out.println(s.substring(6));//an I say!
System.out.println(s.substring(0,3));//What
String s = " yy ds ";
System.out.println(s.trim());//yy ds
String クラスは変更できません。変更すると新しいオブジェクトが作成されるため、効率的ではありません。
これはわずか 10000、つまり 341 ミリ秒です。これを変更する場合は、StringBuffer または StringBuilder を使用することをお勧めします。
String は変更できない性質があるため、文字列の変更を容易にするために、Java では StringBuilder クラスと StringBuffer クラスも提供されています。これら 2 つのクラスのメソッドのほとんどは同じです。
ご興味がございましたら、クリックしてくださいオンラインドキュメント
StringBuffer 使用後 1 ミリ秒。
注: String クラスと StringBuilder クラスは直接変換できません。相互に変換したい場合は、次の原則を使用できます。
いわゆるスレッドセーフティとは、複数人でトイレに行くときのようなもので、このときは部屋が1つしかなく、最初に入ってドアを閉めてから出てきます。この期間中はこの部屋を独り占めでき、誰も入ることができません。まず現在のタスクを完了してリソースを独占し、完了後に占有されているリソースを解放します。