技術共有

Java - 文字列クラス

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. String クラスとは何ですか?

皆さんもC言語を勉強していた時に文字列に触れたことがあると思いますが、C言語では文字列しか使えません。
文字配列 char[10] str = “hello”; または文字ポインタ char *str = “hello”;専用の String クラスは提供されません 。オブジェクト指向 Java では、プログラマにとって使いやすい String クラスとその操作が特別に提供されています。

文字列の不変性

文字列の内容は変更できません。
ここに画像の説明を挿入します

  • String クラスの文字は、実際には value と呼ばれる文字配列を保持します。
  • String クラスは、final によって変更されます。これは、final を継承できないことを意味します。
  • Final は値を変更します。つまり、値は他の配列を参照できませんが、配列の内容は変更できます。

String では、文字列の内容を変更する可能性を伴うすべての操作で新しいオブジェクトが作成され、変更されるのは新しいオブジェクトです。
たとえば、部分文字列を検索する場合は次のようになります。
ここに画像の説明を挿入します
「文字列は不変である。その理由は、その中に文字を格納している配列がfinalによって変更され、したがって変更できないからである」という人もいます。

  • この発言は正しくありませんまず、String の最終変更は、String クラスが最終クラスであり、変更または継承できないことを示します。 最終的に変更された参照型は、参照変数が他のオブジェクトを参照できないが、参照されたオブジェクトの内容は引き続き変更できることを示します。
  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

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2. Stringクラスの基本的な使い方

1 弦の構造

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);
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

ここに画像の説明を挿入します

知らせ:
文字列 s1 = “first”;
Java 仮想マシン (JVM) はまず、文字列「first」が文字列定数プールにすでに存在するかどうかを確認します。存在する場合は、定数プール内の文字列の参照が直接返され、存在しない場合は、文字列が定数プールに追加され、定数プール内のその参照が返されます。

2 String オブジェクトの比較

  1. == 同じ参照かどうかを比較します
     //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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. equals() は と を使用して 2 つの文字列が等しいかどうかを判断し、等しい場合は true を返し、そうでない場合は 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

ここに画像の説明を挿入します
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  1. CompareToIgnoreCase() CompareTo メソッドと同じですが、大文字と小文字を無視します。

        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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3. 文字列検索

方法関数
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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

4.変換

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2. 大文字と小文字の変換

 		String s1 = "hello";
        String s2 = "HELLO";
        System.out.println(s1.toUpperCase());//HELLO
        System.out.println(s1.toLowerCase());//hello
  • 1
  • 2
  • 3
  • 4

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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

4.フォーマットする

		//格式化
        String s = String.format("%d/%02d/%d",2024,07,10);
        System.out.println(s);//2024/07/10
  • 1
  • 2
  • 3

5. 弦の交換

方法関数
文字列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!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

6. 文字列の分割

方法関数
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);
        }
        
        /*
        * 输出:
        字|符|串|拆|分|
        字
        符 串 拆 分
        * */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
       /*
       *拆分是特别常用的操作:
       * 一定要重点掌握
       *另外有些特殊字符(通配符)作为分割符可能无法正确切分, 需要加上转义.
       * */
       String s2 = "192.168.1.16" ;
       String[] result = s2.split("\.") ;
       for(String i: result) {
           System.out.println(i);
       }
       System.out.println("\");
       //为了匹配字面上的点号,你需要使用反斜杠()来转义它,
       // 但在Java字符串中,反斜杠本身也是一个转义字符,
       // 所以你需要使用双反斜杠(\)来表示一个字面量上的反斜杠。
       
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

7. 文字列インターセプト

	 //字符串截取
        String s = "What can I say!";
        System.out.println(s.substring(6));//an I say!
        System.out.println(s.substring(0,3));//What
  • 1
  • 2
  • 3
  • 4

8. 文字列から先頭と末尾のスペースを削除します。

	 String s = "   yy ds       ";
        System.out.println(s.trim());//yy ds
  • 1
  • 2

10. 文字列の変更

String クラスは変更できません。変更すると新しいオブジェクトが作成されるため、効率的ではありません。
ここに画像の説明を挿入します
これはわずか 10000、つまり 341 ミリ秒です。これを変更する場合は、StringBuffer または StringBuilder を使用することをお勧めします。

3. StringBuffer と StringBuilder

String は変更できない性質があるため、文字列の変更を容易にするために、Java では StringBuilder クラスと StringBuffer クラスも提供されています。これら 2 つのクラスのメソッドのほとんどは同じです。
ご興味がございましたら、クリックしてくださいオンラインドキュメント

ここに画像の説明を挿入します

StringBuffer 使用後 1 ミリ秒。
ここに画像の説明を挿入します
注: String クラスと StringBuilder クラスは直接変換できません。相互に変換したい場合は、次の原則を使用できます。

  • 文字列が StringBuilder になる: StringBuilder のコンストラクターまたは append() メソッドを使用します。
  • StringBuilder が String になる: toString() メソッドを呼び出す

String、StringBuffer、StringBuilderの違い

  • String の内容は変更できませんが、StringBuffer と StringBuilder の内容は変更できます。
  • StringBuffer は同期処理を使用し、スレッド セーフな操作です。一方、StringBuilder は同期処理を使用せず、スレッド セーフではない操作です。
    する

いわゆるスレッドセーフティとは、複数人でトイレに行くときのようなもので、このときは部屋が1つしかなく、最初に入ってドアを閉めてから出てきます。この期間中はこの部屋を独り占めでき、誰も入ることができません。まず現在のタスクを完了してリソースを独占し、完了後に占有されているリソースを解放します。