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オブジェクトを返します。

📖 まとめ

📝 演習

  1. 文字列操作: 文字列内で特定の文字が何回出現するかを数える
  2. 文字列反転: 文列を反転するメソッドを作成
  3. 単語数カウント: 文字列内の単語数を数える(スペースで区切る)

次のレッスン

次のレッスンでは、StringBuilderを学びます — 可変文字列の使用。

100%