Java 文字列操作
Javaにおける文字列処理は、プログラミングにおいて最も基本的なスキルの1つです。特にJavaでは、テキストを表現する文字列(String)は、多くのアプリケーションで最も頻繁に利用されるデータ型です。文字列を効率的に操作する能力を身につけることで、テキストデータの加工、フォーマット、分析を自在に行えるようになります。
本章では、Javaで提供されている多種多様な文字列操作メソッドを紹介し、効率的なデータ処理に必要なツールを解説します。比較、変更、抽出、そして検索のためのメソッドを詳しく見ていきましょう。
1. 文字列の比較
文字列の比較は、プログラミングにおいて日常的に発生するタスクです。Javaにはいくつかの比較用メソッドが用意されており、それぞれに異なる特性があります。
1.1 equals() メソッド
equals() メソッドは、2つの文字列の内容を比較します。文字列が完全に一致する場合(文字単位でのマッチング)は true を返し、それ以外の場合は false を返します。このメソッドは大文字と小文字を区別(Case-sensitive)します。
String str1 = "Hello";
String str2 = "Hello";
String str3 = "hello";
System.out.println(str1.equals(str2)); // 出力: true
System.out.println(str1.equals(str3)); // 出力: false1.2 equalsIgnoreCase() メソッド
equalsIgnoreCase() メソッドは equals() と似ていますが、大文字と小文字の違いを無視して比較を行います。
String str1 = "Hello";
String str3 = "hello";
System.out.println(str1.equalsIgnoreCase(str3)); // 出力: true1.3 compareTo() メソッド
compareTo() メソッドは、辞書順(Unicode値に基づく)で2つの文字列を比較します。戻り値は以下の通りです:
- 負の数: 1番目の文字列が2番目の文字列より辞書順で前にある場合。
- ゼロ: 2つの文字列が等しい場合。
- 正の数: 1番目の文字列が2番目の文字列より辞書順で後ろにある場合。
String str1 = "apple";
String str2 = "banana";
String str3 = "apple";
System.out.println(str1.compareTo(str2)); // 出力: 負の値
System.out.println(str1.compareTo(str3)); // 出力: 0
System.out.println(str2.compareTo(str1)); // 出力: 正の値1.4 compareToIgnoreCase() メソッド
compareTo() と同様ですが、大文字と小文字を区別せずに辞書順の比較を行います。
String str1 = "Apple";
String str2 = "apple";
System.out.println(str1.compareToIgnoreCase(str2)); // 出力: 02. 文字列の変更
Javaには文字列を変更するためのメソッドが用意されています。ただし、Javaの文字列はイミュータブル(Immutable:不変)であるため、これらのメソッドは元の文字列を直接書き換えるのではなく、変更内容を含んだ「新しい文字列」を返します。
2.1 concat() メソッド
concat() メソッドは、2つの文字列を連結します。
String str1 = "Hello";
String str2 = " World";
String result = str1.concat(str2);
System.out.println(result); // 出力: Hello World
System.out.println(str1); // 出力: Hello (str1 は不変のまま)ヒント: 一般的には、より簡潔で読みやすい + 演算子を使用した連結が推奨されます。
2.2 substring() メソッド
substring() メソッドは、文字列の一部を抽出します。これには2つのオーバーロード形式があります:
substring(int beginIndex): 指定したインデックスから末尾までを抽出。substring(int beginIndex, int endIndex):beginIndexからendIndexの直前までを抽出(endIndex自体の文字は含まれません)。
String str = "This is a string";
System.out.println(str.substring(5)); // 出力: is a string
System.out.println(str.substring(5, 7)); // 出力: is2.3 replace() メソッド
replace() メソッドは、指定した文字または部分文字列を別の内容に置換します。
replace(char oldChar, char newChar): 指定したすべての文字を置換。replace(CharSequence target, CharSequence replacement): 指定したすべての文字列を置換。
String str = "Hello World";
System.out.println(str.replace('l', 'p')); // 出力: Heppo Worpd
System.out.println(str.replace("World", "Java")); // 出力: Hello Java2.4 replaceAll() と replaceFirst()
これらのメソッドは正規表現(Regular Expression)を使用してマッチングを行うため、replace() よりも強力な機能を持っています。
replaceAll(): すべてのマッチした箇所を置換。replaceFirst(): 最初にマッチした箇所のみを置換。
String str = "Hello 123 World 123";
// すべての数字を ### に置換
System.out.println(str.replaceAll("\\d+", "###")); // 出力: Hello ### World ###
// 最初の数字グループのみ置換
System.out.println(str.replaceFirst("\\d+", "###")); // 出力: Hello ### World 1232.5 ケース変換とトリミング
toLowerCase(): 小文字に変換。toUpperCase(): 大文字に変換。trim(): 文字列の先頭と末尾にある空白文字を除去。
String str = " Hello World ";
System.out.println(str.toLowerCase()); // 出力: hello world
System.out.println(str.trim()); // 出力: Hello World3. 文字列の検索
Javaには、文字列内から特定のコンテンツを探し出すためのメソッドが豊富に揃っています。
3.1 indexOf() メソッド
指定した文字または部分文字列が最初に出現するインデックスを返します。見つからない場合は -1 を返します。
String str = "Hello World";
System.out.println(str.indexOf('o')); // 出力: 4
System.out.println(str.indexOf('o', 5)); // 出力: 7 (インデックス 5 から検索開始)
System.out.println(str.indexOf("World")); // 出力: 63.2 lastIndexOf() メソッド
指定した文字または部分文字列が最後に出現するインデックスを返します。
String str = "Hello World Hello";
System.out.println(str.lastIndexOf("Hello")); // 出力: 123.3 接頭辞・接尾辞・包含のチェック
startsWith(String prefix): 指定した接頭辞で始まるかを確認。endsWith(String suffix): 指定した接尾辞で終わるかを確認。contains(CharSequence s): 指定した文字シーケンスが含まれているかを確認。
String str = "Hello World";
System.out.println(str.startsWith("Hello")); // true
System.out.println(str.endsWith("Java")); // false
System.out.println(str.contains("orl")); // true4. その他の頻出メソッド
| メソッド | 説明 | 例 |
|---|---|---|
length() | 文字列内の文字数を返す。 | "Hi".length() → 2 |
isEmpty() | 長さが 0 であるかを確認する。 | "".isEmpty() → true |
charAt(int i) | 指定したインデックスにある文字を返す。 | "Java".charAt(0) → 'J' |