Stringクラス
文字列は最も一般的に使用されるデータ型の一つです。このレッスンでは、JavaでのStringクラスの使用方法を学びます。
文字列の作成
2つの作成方法
JAVA
// 方法1:文字列リテラル(推奨)
String s1 = "Hello";
// 方法2:newキーワード
String s2 = new String("Hello");
違い
JAVA
String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");
System.out.println(s1 == s2); // true(同じオブジェクト)
System.out.println(s1 == s3); // false(異なるオブジェクト)
System.out.println(s1.equals(s3)); // true(同じ内容)
💡 推奨: 文字列リテラルを使用して文字列を作成してください—より効率的です。Javaは文字列リテラルをキャッシュします。
文字列の特性
不変性
Stringオブジェクトが作成されると、その内容を変更することはできません。
JAVA
String s = "Hello";
s = s + " World"; // 新しいオブジェクトを作成し、元のオブジェクトは変更しない
例:文字列の不変性
JAVA
public class StringImmutable {
public static void main(String[] args) {
String s1 = "Hello";
String s2 = s1.concat(" World");
System.out.println(s1); // Hello(元のオブジェクトは変更されない)
System.out.println(s2); // Hello World(新しいオブジェクト)
}
}
一般的なメソッド
長さとチェック
| メソッド | 説明 | 例 |
|---|---|---|
length() |
文字列の長さ | "Hello".length() → 5 |
isEmpty() |
空の文字列かどうか | "".isEmpty() → true |
isBlank() |
空白のみかどうか | " ".isBlank() → true |
contains() |
部分文字列を含むか | "Hello".contains("ell") → true |
startsWith() |
で始まるか | "Hello".startsWith("He") → true |
endsWith() |
で終わるか | "Hello".endsWith("lo") → true |
例:長さとチェック
JAVA
public class StringCheck {
public static void main(String[] args) {
String s = "Hello, World!";
System.out.println("長さ: " + s.length()); // 13
System.out.println("Worldを含む: " + s.contains("World")); // true
System.out.println("Helloで始まる: " + s.startsWith("Hello")); // true
System.out.println("!で終わる: " + s.endsWith("!")); // true
}
}
検索
| メソッド | 説明 | 例 |
|---|---|---|
indexOf() |
最初の出現位置 | "Hello".indexOf("l") → 2 |
lastIndexOf() |
最後の出現位置 | "Hello".lastIndexOf("l") → 3 |
charAt() |
インデックスの文字 | "Hello".charAt(1) → 'e' |
例:検索
JAVA
public class StringSearch {
public static void main(String[] args) {
String s = "Hello, World!";
System.out.println("indexOf('l'): " + s.indexOf('l')); // 2
System.out.println("lastIndexOf('l'): " + s.lastIndexOf('l')); // 10
System.out.println("charAt(0): " + s.charAt(0)); // H
}
}
部分文字列
| メソッド | 説明 | 例 |
|---|---|---|
substring(int begin) |
beginから最後まで | "Hello".substring(2) → "llo" |
substring(int begin, int end) |
beginからendまで(endは含まない) | "Hello".substring(1,4) → "ell" |
例:部分文字列
JAVA
public class StringSubstring {
public static void main(String[] args) {
String s = "Hello, World!";
System.out.println(s.substring(7)); // World!
System.out.println(s.substring(0, 5)); // Hello
}
}
変換
| メソッド | 説明 | 例 |
|---|---|---|
toUpperCase() |
大文字に変換 | "Hello".toUpperCase() → "HELLO" |
toLowerCase() |
小文字に変換 | "Hello".toLowerCase() → "hello" |
trim() |
先頭・末尾の空白を削除 | " Hi ".trim() → "Hi" |
strip() |
空白を削除(より強力) | " Hi ".strip() → "Hi" |
置換
| メソッド | 説明 | 例 |
|---|---|---|
replace() |
すべて置換 | "Hello".replace("l","L") → "HeLLo" |
replaceAll() |
正規表現置換 | "a1b2c".replaceAll("\\d","") → "abc" |
replaceFirst() |
最初の1つを置換 | "a1b1".replaceFirst("1","X") → "aXb1" |
分割と結合
| メソッド | 説明 | 例 |
|---|---|---|
split() |
文字列を分割 | "a,b,c".split(",") → ["a","b","c"] |
join() |
文字列を結合 | String.join("-","a","b") → "a-b" |
concat() |
連結 | "Hello".concat(" World") → "Hello World" |
例:分割と結合
JAVA
public class StringSplitJoin {
public static void main(String[] args) {
// 分割
String csv = "Alice,Bob,Charlie";
String[] names = csv.split(",");
for (String name : names) {
System.out.println(name);
}
// 結合
String joined = String.join(" | ", names);
System.out.println(joined); // Alice | Bob | Charlie
}
}
文字列比較
== vs equals
JAVA
String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");
System.out.println(s1 == s2); // true(同じオブジェクト)
System.out.println(s1 == s3); // false(異なるオブジェクト)
System.out.println(s1.equals(s3)); // true(同じ内容)
⚠️ 重要: 文字列の比較には必ず
equals()を使用してください。==はアドレスを比較し、equals()は内容を比較します。
compareTo()
辞書順で文字列を比較します。
JAVA
String a = "apple";
String b = "banana";
System.out.println(a.compareTo(b)); // 負の値(aはbの前)
System.out.println(b.compareTo(a)); // 正の値(bはaの後)
System.out.println(a.compareTo(a)); // 0(等しい)
equalsIgnoreCase()
大文字小文字を無視して比較します。
JAVA
String s1 = "Hello";
String s2 = "hello";
System.out.println(s1.equals(s2)); // false
System.out.println(s1.equalsIgnoreCase(s2)); // true
フォーマット
String.format()
JAVA
String name = "Alice";
int age = 25;
double score = 95.5;
String info = String.format("名前: %s, 年齢: %d, スコア: %.1f", name, age, score);
System.out.println(info); // 名前: Alice, 年齢: 25, スコア: 95.5
フォーマット指定子
| 指定子 | 説明 | 例 |
|---|---|---|
%s |
文字列 | %s → "Hello" |
%d |
整数 | %d → 42 |
%f |
浮動小数点 | %.2f → 3.14 |
%n |
改行 | — |
文字列と配列
JAVA
// 文字列 → 文字配列
String s = "Hello";
char[] chars = s.toCharArray();
// 文字配列 → 文字列
String s2 = new String(chars);
// 文字列 → バイト配列
byte[] bytes = s.getBytes();
// バイト配列 → 文字列
String s3 = new String(bytes);
StringBuilder
文字列を頻繁に変更する必要がある場合、StringBuilderの方が効率的です。
JAVA
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
String result = sb.toString(); // "Hello World"
💡 推奨: 1回の連結には
+を使用し、複数の連結にはStringBuilderを使用してください。
❓ よくある質問
Q String、StringBuilder、StringBufferのどちらを選ぶべきですか?
A Stringは不変で、少数の操作に適しています。StringBuilderは可変で、単一スレッドコンテキストで使用します。StringBufferは可変でスレッドセーフです。
Q なぜ文字列比較にequalsを使用するのですか?
A
==はオブジェクトのアドレスを比較し、equals()は内容を比較するためです。Q substringは新しいオブジェクトを作成しますか?
A はい。substringは新しいStringオブジェクトを返します。
📖 まとめ
- Stringは不変です—すべての変更が新しいオブジェクトを作成
- 作成には文字列リテラルを使用(より効率的)
- 文字列比較には必ずequals()を使用
- 一般的なメソッド:length/charAt/substring/equals/indexOf/trim/replace/split
- 頻繁な変更にはStringBuilderを使用
📝 演習
- 文字列操作: 文字列内で特定の文字が何回出現するかを数える
- 文字列反転: 文列を反転するメソッドを作成
- 単語数カウント: 文字列内の単語数を数える(スペースで区切る)
次のレッスン
次のレッスンでは、StringBuilderを学びます — 可変文字列の使用。



