Java は文字列を処理します: 文字列の検索、文字列の比較、および文字列の結合


序文

プログラミングでは文字列の処理が必要になることがよくありますが、よく使われる文字列の処理方法をいくつか紹介します。


1. 文字列の比較

1.1 比較には == ではなく、equals() を使用します。

public class TestString {
    
    
    public static void main(String[] args) {
    
    
        String s1 = "hello";
        String s2 = "hello";
        System.out.println(s1 == s2); //true
        System.out.println(s1.equals(s2)); //true
    }
}

ここでは == とquals() の両方が true であることがわかりますが、Java コンパイラーはコンパイル中にすべて同じ文字列をオブジェクトとして定数プールに自動的に入れます。また、当然のことながら s1 と s2 の参照は同じです。
== を別の方法で書くと false のように見えます。

public class TestString {
    
    
    public static void main(String[] args) {
    
    
        String s1 = "hello";
        String s2 = "HELLO".toLowerCase();
        System.out.println(s1 == s2); //false
        System.out.println(s1.equals(s2)); //true
    }
}

1.2qualsIgnoreCase() による大文字と小文字の比較を無視する

public class TestString {
    
    
    public static void main(String[] args) {
    
    
        String s1 = "hello";
        String s2 = "HELLO".toLowerCase();
        System.out.println(s1.equals(s2)); //false
        System.out.println(s1.equalsIgnoreCase(s2)); //true
    }
}

2. 部分文字列 contains()、indexOf()、lastIndexOf()、startsWith()、endsWith() を検索します。

public class TestString {
    
    
    public static void main(String[] args) {
    
    
        "sunshine".contains("sun"); // true
        "sunshine".indexOf("s"); // 0
		"sunshine".lastIndexOf("s"); // 3
		"sunshine".startsWith("sun"); // true
		"sunshine".endsWith("ine"); // true
    }
}

3. 部分文字列を抽出する substring()

文法:

//beginIndex -- 起始索引(包括), 索引从 0 开始。
public String substring(int beginIndex)
//endIndex -- 结束索引(不包括)。
public String substring(int beginIndex, int endIndex)
public class TestString {
    
    
    public static void main(String[] args) {
    
    
        "sunshine".substring(1); // "unshine"
		"sunshine".substring(3, 7); //"shine"
    }
}

4. 最初と最後の空白文字を削除しますtrim()、stripLeading()、stripTrailing()、strip()

文字列から先頭と末尾の空白文字を削除するには、trim() メソッドを使用します。空白文字には、スペース、\t、\r、\n が含まれます。

public class TestString {
    
    
    public static void main(String[] args) {
    
    
        "  \tsunshine\r\n ".trim(); // "sunshine"
        "\u3000sunshine\u3000".strip(); // "sunshine"
		" sunshine ".stripLeading(); // "sunshine "
		" sunshine ".stripTrailing(); // " sunshine"
    }
}

5. 文字列が空であるか isEmpty() か空の文字列であるかどうかを判断します isBlank()

コードは次のとおりです(例)。

public class TestString {
    
    
    public static void main(String[] args) {
    
    
        "".isEmpty(); // true,因为字符串长度为0
		"  ".isEmpty(); // false,因为字符串长度不为0
		"  \n".isBlank(); // true,因为只包含空白字符
		" Hello ".isBlank(); // false,因为包含非空白字符
    }
}

6. 部分文字列を置換 replace() または正規表現

6.1 replace()

public class TestString {
    
    
    public static void main(String[] args) {
    
    
        String s = "sunsunshine";
		s.replace('s', 'w'); // "wunwunwhine",所有字符's'被替换为'w'
		s.replace("su", "~~"); // "~~n~~nshine",所有子串"su"被替换为"~~"
    }
}

6.2 正規表現の使用:

public class TestString {
    
    
    public static void main(String[] args) {
    
    
		String s = "A,,B;C ,D";
		s.replaceAll("[\\,\\;\\s]+", ","); // "A,B,C,D"
    }
}

7つの分割文字列split()、結合された文字列join()

public class TestString {
    
    
    public static void main(String[] args) {
    
    
		String s = "A,B,C,D";
		//分割字符串
		String[] ss = s.split("\\,"); // {"A", "B", "C", "D"}
		String[] arr = {
    
    "A", "B", "C"};
		//拼接字符串
		String s = String.join("***", arr); // "A***B***C"
    }
}

8 を char[] に変換

String 型と char[] 型は相互に変換できます。

public class TestString {
    
    
    public static void main(String[] args) {
    
    
		char[] cs = "Hello".toCharArray(); // String -> char[]
		String s = new String(cs); // char[] -> String
    }
}

char[] 配列が変更されても、文字列は変更されません

public class TestString {
    
    
    public static void main(String[] args) {
    
    
		char[] cs = "Hello".toCharArray(); // String -> char[]
		String s = new String(cs); // char[] -> String
		System.out.println(s);//"Hello"
        cs[0] = 'X';
        System.out.println(s);//"Hello"
    }
}

これは、 new String(char[]) を通じて新しい String インスタンスを作成するときに、受信した char[] 配列を直接参照せず、コピーを作成するため、外部 char[] 配列を変更しても char[ ] String インスタンス内の配列。これらは 2 つの異なる配列であるためです。

9 つの効率的な文字列スプライシング StringBuilder、StringJoiner、join()

9.1 文字列ビルダー

Java コンパイラは文字列に対して特別な処理を行うため、 + を直接使用して文字列を結合できます。

public class TestString {
    
    
    public static void main(String[] args) {
    
    
		String s = "";
		for (int i = 0; i < 1000; i++) {
    
    
    		s = s + "," + i;
		}
    }
}

ただし、サイクルごとに新しい文字列オブジェクトが作成され、古い文字列が破棄されるため、この方法の使用はお勧めできません。これにより、大量の一時オブジェクトが生成され、メモリが無駄になるだけでなく、GC 効率にも影響します。

文字列を効率的に連結するには、新しい文字が追加されたときに新しい一時オブジェクトが作成されないように、バッファーを事前に割り当てることができる変数オブジェクトである StringBuilder を使用することをお勧めします。

StringBuilder はチェーン操作も使用できます。これは、append() メソッドがこれを返すため、それ自体の他のメソッドを継続的に呼び出すことができるためです。

public class TestString {
    
    
    public static void main(String[] args) {
    
    
		StringBuilder sb = new StringBuilder(1024);
		for (int i = 0; i < 100; i++) {
    
    
	   		sb.append(',');
	    	sb.append(i);
		}
		String s = sb.toString();
		//使用链式操作
		StringBuilder sb1 = new StringBuilder(1024);
		sb1.append("Mr ")
			.append("Zhang")
          	.append("!")
          	.insert(0, "Hello, ");
        //"Hello, Mr Zhang!"
        System.out.println(sb.toString());
    }
}

9.2 文字列結合器

実際の開発では配列をセパレータで繋ぎ合わせて複数のデータを繋ぎ合わせて返すことが多いのですが、その際にはStringJoinerを使うと便利です。
まずは StringBuilder でこれに対処する方法を見てみましょう。

public class TestString {
    
    
    public static void main(String[] args) {
    
    
		StringBuilder sb = new StringBuilder(1024);
		String[] msgs= {
    
    "第1条处理成功", "第2条处理成功", "第3条处理失败"};
		sb.append("处理情况:");
        for (String msg: msgs) {
    
    
            sb.append(msg).append(",");
        }
        // 注意去掉最后的",":
        sb.delete(sb.length() - 1, sb.length());
        sb.append("!");
        //处理情况:第1条处理成功,第2条处理成功,第3条处理失败!
        System.out.println(sb.toString());
    }
}

StringJoiner を処理する方法を見てみましょう。

public class TestString {
    
    
    public static void main(String[] args) {
    
    
		StringJoiner sj = new StringJoiner(",");
		String[] msgs= {
    
    "第1条处理成功", "第2条处理成功", "第3条处理失败"};
        for (String msg: msgs) {
    
    
            sj.add(msg);
        }
        //第1条处理成功,第2条处理成功,第3条处理失败
        System.out.println(sj.toString());
        //还可以添加头和尾
        StringJoiner sjoiner = new StringJoiner(",","处理情况:","!");
        for (String msg: msgs) {
    
    
            sjoiner.add(msg);
        }
        //处理情况:第1条处理成功,第2条处理成功,第3条处理失败!
        System.out.println(sjoiner.toString());
    }
}

これは文字列を連結する場合に非常に便利です。

9.3 「開始」と「終了」を指定する必要がない場合は、join() を使用します。

また、String には、文字列を結合する際に前述した静的メソッド join() も用意されており、「先頭」と「末尾」を指定する必要がない場合に使用するのに適しています。

public class TestString {
    
    
    public static void main(String[] args) {
    
    
		String[] arr = {
    
    "A", "B", "C"};
		//拼接字符串
		String s = String.join("***", arr); // "A***B***C"
		String[] msgs= {
    
    "第1条处理成功", "第2条处理成功", "第3条处理失败"};
		//第1条处理成功,第2条处理成功,第3条处理失败
		String msg = String.join(",", msgs); 
    }
}

要約する

この記事では、文字列を処理するための一般的な方法をいくつか紹介しますが、実際の開発では、開発を効率化するために文字列を処理する必要が生じることがよくあります。

おすすめ

転載: blog.csdn.net/sunzixiao/article/details/127874130
おすすめ