Javaの文字列
JavaのStringクラスは、最も広く使われているクラスの一つです。JavaのStringクラスは、java.langパッケージで定義されています。
JavaのString
- Basically, string is a sequence of characters but it’s not a primitive type.
- When we create a string in java, it actually creates an object of type String.
- String is immutable object which means that it cannot be changed once it is created.
- String is the only class where operator overloading is supported in java. We can concat two strings using + operator. For example “a”+”b”=”ab”.
- Java provides two useful classes for String manipulation – StringBuffer and StringBuilder.
JavaのStringクラスについてもっと学びましょう。
文字列を作成するさまざまな方法
Javaで文字列オブジェクトを作成する方法はたくさんありますが、以下にいくつか人気のある方法があります。
-
- 文字列リテラルを使用する
-
- 文字列を作成する最も一般的な方法です。この場合、文字列リテラルは二重引用符で囲まれます。
-
- String str = “abc”;
二重引用符を使用して文字列を作成すると、JVMはStringプールを検索して、同じ値で保存されている他のStringがあるかどうかを調べます。見つかった場合、そのStringオブジェクトへの参照を返すだけで、新しいStringオブジェクトは作成しません。見つからない場合は、指定された値で新しいStringオブジェクトを作成してStringプールに保存します。
newキーワードを使用する
通常の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()メソッドを提供しており、これらのメソッドを使用して2つの文字列を比較することができます。これらのメソッドは、文字列の値を比較して、2つの文字列が等しいかどうかをチェックします。2つの文字列が等しい場合はtrueを返し、等しくない場合はfalseを返します。
package com.scdev.string.examples;
/**
* Java String Example
*
* @author scdev
*
*/
public class StringEqualExample {
public static void main(String[] args) {
//creating two string object
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の値に変換され、整数値が返されます。文字列が等しい場合はゼロを返し、そうでない場合はゼロよりも大きいか小さい整数を返します。
package com.scdev.examples;
/**
* Java String compareTo Example
*
* @author scdev
*
*/
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 の例を読んでください。
Javaの文字列メソッド
例題プログラムを使って、いくつかの人気のあるStringクラスのメソッドを見てみましょう。
-
- split()
-
- JavaのString split()メソッドは、指定された表現を使用して文字列を分割するために使用されます。split()メソッドには2つのバリアントがあります。
split(String regex):このメソッドは、指定された正規表現を使用して文字列を分割し、文字列の配列を返します。
split(String regex, int limit):このメソッドは、指定された正規表現を使用して文字列を分割し、配列の要素を指定された制限によって制限します。指定された制限が2の場合、メソッドはサイズ2の配列を返します。
package com.scdev.examples;
/**
* Java String split example
*
* @author scdev
*
*/
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
contains(CharSequence s)
JavaのString contains()メソッドは、文字列が指定された文字列のシーケンスを含んでいるかどうかをチェックします。このメソッドは、文字列が指定された文字列のシーケンスを含んでいる場合はtrueを返し、それ以外の場合はfalseを返します。
package com.scdev.examples;
/**
* Java String contains() Example
*
* @author scdev
*
*/
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
length()
JavaのString length()メソッドは、文字列の長さを返します。
package com.scdev.examples;
/**
* Java String length
*
* @author scdev
*
*/
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
}
}
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):このメソッドは、指定された正規表現に一致する部分文字列のすべての出現を指定された置換文字列で置換します。
replaceFirst(String regex, String replacement):このメソッドは、指定された正規表現に一致する最初の部分文字列を指定された置換文字列で置換します。
package com.scdev.examples;
/**
* Java String replace
*
* @author scdev
*
*/
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 scdev, Hello scdev”;
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 scdev, Hi scdev
置換後:
Hi guys, Hello world
format()
JavaのString format()メソッドは、文字列をフォーマットするために使用されます。java String format()メソッドには2つのバリアントがあります。
format(Locale l, String format, Object… args):このメソッドは、指定されたロケール、文字列フォーマット、および引数を使用して文字列をフォーマットします。
format(String format, Object… args):このメソッドは、指定された文字列フォーマットと引数を使用して文字列をフォーマットします。
package com.scdev.examples;
import java.util.Locale;
/**
* Java String format
*
* @author scdev
*
*/
public class StringFormatExample {
public static void main(String[] args) {
String s = “scdev.com”;
// %sは文字列を追加するために使用されます
System.out.println(String.format(“これは%sです”, s));
//Locale.USを使用
System.out.println(String.format(Locale.US, “%f”, 3.14));
}
}
上記のプログラムの出力結果は:
これはscdev.comです
3.140000
substring()
このメソッドは、指定されたインデックスに基づいて文字列の一部を返します。
package com.scdev.examples;
/**
* Java String substring
*
*/
public class StringSubStringExample {
public static void main(String[] args) {
String s = “This is scdev.com”;
s = s.substring(8,18);
System.out.println(s);
}
}
文字列の結合
Javaでは、文字列の連結は非常に基本的な操作です。文字列は、「+」演算子を使用するか、concat()メソッドを使用して連結することができます。
package com.scdev.examples;
/**
* Java String concatenation
*
* @author scdev
*
*/
public class StringConcatExample {
public static void main(String[] args) {
String s1 = "Hello";
String s2 = "World";
String s3 = s1 + s2;
//using + operator
System.out.println("Using + operator: ");
System.out.println(s3);
//using concat method
System.out.println("Using concat method: ");
System.out.println(s1.concat(s2));
}
}
上記のプログラムの出力は次のとおりです。
Using + operator:
HelloWorld
Using concat method:
HelloWorld
Javaでの文字列連結に関するより詳しい情報は、この投稿をチェックしてください。
JavaのStringプール
メモリ管理は、どんなプログラミング言語にとっても最も重要な要素です。Javaにおける文字列のメモリ管理は、他のクラスとは少しだけ異なります。Javaをよりメモリ効率の良いものにするために、JVMは文字列のための特別なメモリ領域である「String Constant Pool」を導入しました。文字列リテラルを作成する際、それがすでに文字列プール内に存在するかどうかをチェックします。もし存在していれば、文字列プール内の既存の文字列の参照を返します。以下の例題プログラムを見てみましょう。
package com.scdev.examples;
/**
* Java String Pool Example
*
*/
public class StringPoolExample {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
String c = "def";
//same reference
if (a==b) {
System.out.println("Both string refer to the same object");
}
//different reference
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()メソッドを呼び出すと、プールに同じ値を持つStringが既に存在するかどうかをチェックします。存在する場合、プールからそのStringオブジェクトへの参照を返します。存在しない場合は、プールに同じ内容を持つ新しいStringを作成して参照を返します。
package com.scdev.examples;
/**
* Java String intern
*
* @author scdev
*
*/
public class StringInternExample {
public static void main(String[] args) {
String s1 = "scdev";
String s2 = "scdev";
String s3 = new String("scdev");
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メソッドに関するこの投稿をチェックしてください。
文字列の不変性の利点
文字列が不変のクラスであることの利点のいくつかは次のとおりです:
-
- 文字列の定数プールは、したがってメモリを節約します。
-
- 変更できないため、セキュリティが確保されます。
-
- スレッドセーフです。
- クラスのローディングのセキュリティです。
Stingイミュータビリティのメリットについては、この投稿をチェックしてください。
Java 8のString join()メソッド
Java 8では、Stringクラスに新しいstaticなjoin()メソッドが追加されました。このメソッドは、指定された区切り文字のコピーと、CharSequenceの要素のコピーを結合した新しいStringを返します。簡単に理解するために、以下に例を示します。
List<String> words = Arrays.asList(new String[]{"Hello", "World", "2019"});
String msg = String.join(" ", words);
System.out.println(msg);
Output: こんにちは世界2019年
Java 9の文字列メソッド
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() – returns true if the string is empty or contains only white space codepoints, otherwise false.
- lines() – returns a stream of lines extracted from this string, separated by line terminators.
- strip(), stripLeading(), stripTrailing() – for stripping leading and trailing white spaces from the string.
- repeat() – returns a string whose value is the concatenation of this string repeated given number of times.
これらのメソッドを使った具体的なプログラム例を見てみましょう。
package com.scdev.strings;
import java.util.List;
import java.util.stream.Collectors;
/**
* JDK 11 New Functions in String class
*
* @author scdev
*
*/
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クラスについて、そのメソッドと文字列操作の例については以上です。
弊社のGitHubリポジトリから、もっと多くの文字列の例をチェックアウトできます。
参照:APIドキュメント