Java String

JavaのStringは最も広く使われているクラスの1つです。Java Stringクラスはjava.langパッケージに定義されています。

Java String

  • 基本的に、文字列は文字の連続ですが、プリミティブ型ではありません。
  • Javaで文字列を作成すると、実際にはString型のオブジェクトが作成されます。
  • Stringは変更不可能なオブジェクトであり、一度作成されると変更できないことを意味します。
  • Stringは、Javaで演算子オーバーロードがサポートされている唯一のクラスです。+演算子を使用して2つの文字列を連結できます。例えば"a"+"b"="ab"
  • Javaは、文字列操作に役立つ2つの便利なクラスを提供しています – StringBufferStringBuilder

さあ、JavaのStringクラスについて詳しく学んでみましょう。

文字列の作成方法

Javaで文字列オブジェクトを作成する方法はたくさんありますが、いくつかの一般的な方法を以下に示します。

  1. 文字列リテラルの使用

    これは文字列を作成する最も一般的な方法です。この場合、文字列リテラルは二重引用符で囲まれています。

    String str = "abc"; 
    

    二重引用符を使用して文字列を作成すると、JVMは同じ値で保存されている他の文字列があるかどうかを文字列プールで検索します。見つかった場合、その文字列オブジェクトへの参照を返すだけで、それ以外の場合は指定された値で新しい文字列オブジェクトを作成し、文字列プールに保存します。

  2. 新しいキーワードの使用

    通常のJavaクラスと同様に、new演算子を使用してStringオブジェクトを作成できます。Stringクラスには、char配列、byte配列、StringBuffer、およびStringBuilderからStringを取得するためのいくつかのコンストラクタがあります。

    String str  =  new String("abc");
    char[] a = {'a', 'b', 'c'};
    String str2  =  new String(a);
    

Java Stringの比較

Stringクラスは、equals()およびequalsIgnoreCase()メソッドを提供して、二つの文字列を比較します。これらのメソッドは文字列の値を比較して、二つの文字列が等しいかどうかを確認します。二つの文字列が等しい場合はtrueを、そうでない場合はfalseを返します。

package com.journaldev.string.examples;

/**
 * Java String Example
 * 
 * @author pankaj
 *
 */
public class StringEqualExample {

	public static void main(String[] args) {
		//二つの文字列オブジェクトを作成
		String s1 = "abc";
		String s2 = "abc";
		String s3 = "def";
		String s4 = "ABC";
		
		System.out.println(s1.equals(s2));//true
		System.out.println(s2.equals(s3));//false
		
		System.out.println(s1.equals(s4));//false;
		System.out.println(s1.equalsIgnoreCase(s4));//true
	}

}

上記プログラムの出力は:

true
false
false
true

Stringクラスは、Comparableインターフェースを実装しており、compareTo()メソッドとcompareToIgnoreCase()メソッドを提供し、2つの文字列を辞書順に比較します。両方の文字列はUnicode値に変換され、比較結果として整数値が返されます。整数値は、0より大きいか、0より小さいか、0に等しいかのいずれかです。文字列が等しい場合は0を返し、そうでない場合は0より大きいか0より小さいかのいずれかを返します。

package com.journaldev.examples;

/**
 * Java String compareTo Example
 * 
 * @author pankaj
 *
 */
public class StringCompareToExample {

	public static void main(String[] args) {
		
		String a1 = "abc";
		String a2 = "abc";
		String a3 = "def";
		String a4 = "ABC";
		
		System.out.println(a1.compareTo(a2));//0
		System.out.println(a2.compareTo(a3));//less than 0
		System.out.println(a1.compareTo(a4));//greater than 0
		System.out.println(a1.compareToIgnoreCase(a4));//0
	}

}

上記プログラムの出力は次のとおりです:

0
-3
32
0

詳細については、String compareTo exampleで詳しく説明してください。

Java String Methods

いくつかの人気のあるStringクラスのメソッドを例を挙げて見てみましょう。

  1. split()

    JavaのString split()メソッドは、指定された式を使用して文字列を分割するために使用されます。split()メソッドには2つのバリアントがあります。

    • split(String regex):このメソッドは、指定された正規表現式を使用して文字列を分割し、文字列の配列を返します。
    • split(String regex, int limit):このメソッドは、指定された正規表現式を使用して文字列を分割し、文字列の配列を返しますが、配列の要素は指定された制限によって制限されます。指定された制限が2の場合、メソッドはサイズ2の配列を返します。
    package com.journaldev.examples;
    
    /**
     * Java String split example
     * 
     * @author pankaj
     *
     */
    public class StringSplitExample {
    
    	public static void main(String[] args) {
    		
    		String s = "a/b/c/d";
    		String[] a1 = s.split("/");
    		System.out.println("正規表現のみを使用して文字列を分割:");
    		for (String string : a1) {
    			System.out.println(string);
    		}
    		System.out.println("制限付きの正規表現を使用して文字列を分割:");
    		String[] a2 = s.split("/", 2);
    		for (String string : a2) {
    			System.out.println(string);
    		}
    	}
    
    }
    

    上記プログラムの出力は次のとおりです:

    正規表現のみを使用して文字列を分割:
    a
    b
    c
    d
    制限付きの正規表現を使用して文字列を分割:
    a
    b/c/d
    
  2. contains(CharSequence s)

    Java String contains()メソッドは、文字列が指定された文字シーケンスを含んでいるかどうかを確認します。このメソッドは、文字列が指定された文字シーケンスを含んでいればtrueを返し、それ以外の場合はfalseを返します。

    package com.journaldev.examples;
    
    /**
     * Java String contains()の例
     * 
     * @author pankaj
     *
     */
    public class StringContainsExample {
    
    	public static void main(String[] args) {
    		String s = "Hello World";
    		
    		System.out.println(s.contains("W"));//true
    		System.out.println(s.contains("X"));//false
    	}
    
    }
    

    上記のプログラムの出力は:

    true
    false
    
  3. length()

    JavaのString length()メソッドは文字列の長さを返します。

    package com.journaldev.examples;
    
    /**
     * Java String length
     * 
     * @author pankaj
     *
     */
    public class StringLengthExample {
    
    	public static void main(String[] args) {
    		
    		String s1 = "abc";
    		String s2 = "abcdef";
    		String s3 = "abcdefghi";
    		
    		System.out.println(s1.length());//3
    		System.out.println(s2.length());//6
    		System.out.println(s3.length());//9
    
    	}
    
    }
    
  4. replace()

    JavaのString replace()メソッドは、文字列の特定の部分を他の文字列で置換するために使用されます。replace()メソッドには4つのバリアントがあります。

    • replace(char oldChar, char newChar): このメソッドは、文字列内のoldCharのすべての出現をnewCharで置換します。
    • replace(CharSequence target, CharSequence replacement): このメソッドは、文字列内の各targetリテラルをreplacementリテラルで置換します。
    • replaceAll(String regex, String replacement): このメソッドは、指定されたregexに一致する部分文字列のすべての出現を指定された置換で置換します。
    • replaceFirst(String regex, String replacement): このメソッドは、指定されたregexに一致する最初の部分文字列を指定された置換で置換します。
    package com.journaldev.examples;
    
    /**
     * JavaのString replace
     * 
     * @author pankaj
     *
     */
    public class StringReplaceExample {
    
    	public static void main(String[] args) {
    		
    		//replace(char oldChar,  char newChar)
    		String s = "Hello World";
    		s = s.replace('l', 'm');
    		System.out.println("lをmに置換した後:");
    		System.out.println(s);
    		
    		//replaceAll(String regex, String replacement)
    		String s1 = "Hello journaldev, Hello pankaj";
    		s1 = s1.replaceAll("Hello", "Hi");
    		System.out.println("置換後:");
    		System.out.println(s1);
    		
    		//replaceFirst(String regex, String replacement) 
    		String s2 = "Hello guys, Hello world";
    		s2 = s2.replaceFirst("Hello", "Hi");
    		System.out.println("置換後:");
    		System.out.println(s2);
    
    	}
    
    }
    

    上記のプログラムの出力は次のとおりです:

    lをmに置換した後:
    Hemmo Wormd
    置換後:
    Hi journaldev, Hi pankaj
    置換後:
    Hi guys, Hello world
    
  5. format()

    Java Sting format() メソッドは文字列をフォーマットするために使用されます。java String format() メソッドには2つのバリアントがあります。

    • format(Locale l, String format, Object… args): このメソッドは指定されたロケール、文字列フォーマット、引数を使用して文字列をフォーマットします。
    • format(String format, Object… args): このメソッドは指定された文字列フォーマットと引数を使用して文字列をフォーマットします。
    package com.journaldev.examples;
    
    import java.util.Locale;
    
    /**
     * Java String format
     * 
     * @author pankaj
     *
     */
    public class StringFormatExample {
    
    	public static void main(String[] args) {
    		
    		String s = "journaldev.com";
    		// %s is used to append the string
    		System.out.println(String.format("This is %s", s));
    		
    		//using locale as Locale.US
    		System.out.println(String.format(Locale.US, "%f", 3.14));
    	}
    }
    

    上記のプログラムの出力は次のとおりです:

    This is journaldev.com
    3.140000
    
  6. substring()

    このメソッドは、指定されたインデックスに基づいて文字列の一部を返します。

    package com.journaldev.examples;
    
    /**
     * Java String substring
     *
     */
    public class StringSubStringExample {
    
    	public static void main(String[] args) {
    		
    		String s = "This is journaldev.com";
    		s = s.substring(8,18);
    		System.out.println(s);
    	}
    }
    

String Concatenation

文字列の連結は、Javaで非常に基本的な操作です。文字列は、「+」演算子を使用するか、concat()メソッドを使用して連結できます。

package com.journaldev.examples;

/**
 * Java String concatenation
 * 
 * @author pankaj
 *
 */
public class StringConcatExample {

	public static void main(String[] args) {
		
		String s1 = "Hello";
		String s2 = "World";
		String s3 = s1 + s2;
		// + 演算子を使用する
		System.out.println("Using + operator: ");
		System.out.println(s3);
		
		// concat メソッドを使用する
		System.out.println("Using concat method: ");
		System.out.println(s1.concat(s2));

	}

}

上記プログラムの出力は次のとおりです:

Using + operator: 
HelloWorld
Using concat method: 
HelloWorld

詳細については、この投稿をチェックしてください:Javaでの文字列の連結

Java String Pool

メモリ管理は、どのプログラミング言語においても最も重要な側面です。Javaにおける文字列のメモリ管理は、他のクラスとは少し異なります。Javaをよりメモリ効率の良いものにするために、JVMは文字列専用の特別なメモリ領域を導入しました。文字列リテラルを作成すると、文字列プールに同一の文字列が既に存在するかどうかをチェックします。存在する場合は、文字列プール内の既存の文字列の参照を返します。以下のプログラムの例を見てみましょう。

package com.journaldev.examples;

/**
 * Java String Pool Example
 * 
 */
public class StringPoolExample {

	public static void main(String[] args) {
		
		String a = "abc";
		String b = "abc";
		String c = "def";
		
		//同じ参照
		if (a==b) {
			System.out.println("Both string refer to the same object");
		}
		
		//異なる参照
		if (a==c) {
			System.out.println("Both strings refer to the same object");
		}else {
			System.out.println("Both strings refer to the different object");
		}

	}

}

上記プログラムの出力は次のとおりです。

Both string refer to the same object
Both strings refer to the different object

Java String Poolの詳細については、この投稿をご覧ください。

String intern() メソッド

文字列リテラルを使用して文字列を作成すると、文字列プールに作成されますが、同じ値を持つ文字列をnewキーワードを使用して作成した場合はどうなるでしょうか?このような場合にはintern()メソッドが使用され、文字列オブジェクトの正規表現を返します。newキーワードを使用して作成された文字列オブジェクトに対してintern()メソッドを呼び出すと、プール内に同じ値を持つ文字列がすでに存在するかどうかをチェックします。存在する場合は、プールからその文字列オブジェクトへの参照を返します。存在しない場合は、プール内に同じ内容の新しい文字列を作成し、その参照を返します。

package com.journaldev.examples;

/**
 * Java String intern
 * 
 * @author pankaj
 *
 */
public class StringInternExample {

	public static void main(String[] args) {
		
		String s1 = "pankaj";
		String s2 = "pankaj";
		String s3 = new String("pankaj");
		
		System.out.println(s1==s2);//true
		System.out.println(s2==s3);//false
		
		String s4 = s3.intern();
		System.out.println(s1==s4);//true

	}

}

この投稿をチェックして、Java String internメソッドについて詳しく学んでください。

文字列の不変性の利点

文字列が不変クラスである利点の一部は次のとおりです:

  1. 文字列定数プール、したがってメモリを節約します。
  2. 変更できないため、セキュリティが向上します。
  3. スレッドセーフ
  4. クラスの読み込みセキュリティ

より多くの情報は、Sting Immutablity Benefitsの投稿を参照してください。

Java 8 String join()

A new static method join() has been added in String class in Java 8. This method returns a new String composed of copies of the CharSequence elements joined together with a copy of the specified delimiter. Let’s look at an example to understand it easily.

List<String> words = Arrays.asList(new String[]{"Hello", "World", "2019"});
String msg = String.join(" ", words);
System.out.println(msg);

出力:Hello World 2019

Java 9 String Methods

Java 9リリースでStringクラスに追加された2つのメソッドがあります。それらは、codePoints()とchars()です。これらのメソッドはどちらもIntStreamオブジェクトを返し、それに対していくつかの操作を行うことができます。これらのメソッドを簡単に見てみましょう。

String s = "abc";

s.codePoints().forEach(x -> System.out.println(x));

s.chars().forEach(x -> System.out.println(x));

出力:

97
98
99
97
98
99

Java 11のStringクラスの新しいメソッド

Java 11リリースでは、Stringクラスに多くの新しいメソッドが追加されました。

  • isBlank() – 文字列が空またはホワイトスペースのコードポイントのみを含む場合はtrue、それ以外の場合はfalseを返します。
  • lines() – この文字列から抽出された行のストリームを返し、行は行終端子で区切られます。
  • strip()、stripLeading()、stripTrailing() – 文字列から先頭および末尾のホワイトスペースを取り除くためのメソッド。
  • repeat() – この文字列を指定された回数繰り返した値を持つ文字列を返します。

これらのメソッドについての例を見てみましょう。

package com.journaldev.strings;

import java.util.List;
import java.util.stream.Collectors;

/**
 * JDK 11 New Functions in String class
 * 
 * @author pankaj
 *
 */
public class JDK11StringFunctions {

	public static void main(String[] args) {
		// isBlank()
		String s = "abc";
		System.out.println(s.isBlank());
		s = "";
		System.out.println(s.isBlank());

		// lines()
		String s1 = "Hi\nHello\rHowdy";
		System.out.println(s1);
		List lines = s1.lines().collect(Collectors.toList());
		System.out.println(lines);

		// strip(), stripLeading(), stripTrailing()
		String s2 = "  Java,  \tPython\t ";
		System.out.println("#" + s2 + "#");
		System.out.println("#" + s2.strip() + "#");
		System.out.println("#" + s2.stripLeading() + "#");
		System.out.println("#" + s2.stripTrailing() + "#");

		// repeat()
		String s3 = "Hello\n";
		System.out.println(s3.repeat(3));
		s3 = "Co";
		System.out.println(s3.repeat(2));

	}

}

出力:

false
true
Hi
Hello
Howdy
[Hi, Hello, Howdy]
#  Java,  	Python	 #
#Java,  	Python#
#Java,  	Python	 #
#  Java,  	Python#
Hello
Hello
Hello

CoCo

これでJava Stringクラス、そのメソッド、およびStringの操作の例についてのすべてです。

詳細なStringの例は、弊社のGitHubリポジトリからご覧いただけます。

参照: API Doc

Source:
https://www.digitalocean.com/community/tutorials/java-string