カテゴリ: JavaSilver試験対策 更新日: 2026/03/24

JavaのStringクラスの不変性とreplaceAllメソッドを徹底解説!初心者向けの実践知識

019
JavaのStringクラスの不変性とreplaceAllメソッド

先生と生徒の会話形式で理解しよう

生徒

「JavaのStringクラスで文字列を置換したのに、値が変わりませんでした。どうしてですか?」

先生

Stringクラスは不変オブジェクトなので、元の文字列は変更されません。新しい文字列が生成される仕組みなんですよ。」

生徒

「不変オブジェクトとは何ですか?」

先生

「不変オブジェクトについて詳しく説明しますね。一緒にコードを使って確認してみましょう!」

1. Stringクラスはなぜ不変なのか?

1. Stringクラスはなぜ不変なのか?
1. Stringクラスはなぜ不変なのか?

JavaのStringクラスは不変(immutable)です。これは、Stringオブジェクトが生成されると、その内部の値が変更されることがないという性質を持っています。この設計には以下のメリットがあります。

  • 安全性: 同じ文字列を共有する複数の参照が影響を受けません。
  • 効率性: 文字列リテラルはキャッシュされ、再利用されるため、メモリ使用量が削減されます。
  • スレッドセーフ: 不変オブジェクトはどのスレッドからも安全にアクセスできます。

2. replaceAllメソッドの挙動

2. replaceAllメソッドの挙動
2. replaceAllメソッドの挙動

replaceAllメソッドは、指定した文字列を置換して新しいStringオブジェクトを生成します。元の文字列は変更されません。以下のコードを見てみましょう。


public class ReplaceExample {
    public static void main(String[] args) {
        String original = "apple, orange";
        String replaced = original.replaceAll("apple", "banana");

        System.out.println("Original: " + original); // 出力: apple, orange
        System.out.println("Replaced: " + replaced); // 出力: banana, orange
    }
}

この例では、replaceAllによって生成された新しい文字列がreplacedに代入されており、originalの値はそのままです。

3. 実際の問題例を解説

3. 実際の問題例を解説
3. 実際の問題例を解説

次のコードを考えてみましょう。このコードでは、Stringの不変性を理解するための実践的な例を示しています。


public class Main {
    public static void main(String[] args) {
        String text = "hello, world.";
        modifyString(text);
        System.out.println(text); // 出力: hello, world.
    }

    private static void modifyString(String input) {
        input.replaceAll("hello", "hi");
    }
}

このコードのmodifyStringメソッド内でreplaceAllを呼び出していますが、元の文字列textは変更されません。新しい文字列が生成されても、それが戻り値として返されない限り元の変数には影響がありません。

Javaをこれから始める人や、 オブジェクト指向の考え方を基礎から理解したい人には、 定番の入門書がこちらです。

スッキリわかるJava入門 第4版をAmazonで見る

※ Amazon広告リンク

4. Stringクラスの不変性を活用する方法

4. Stringクラスの不変性を活用する方法
4. Stringクラスの不変性を活用する方法

不変性を理解した上で、文字列を効果的に扱う方法を以下に示します。


public class StringUsage {
    public static void main(String[] args) {
        String message = "Java is fun";
        message = message.replaceAll("fun", "powerful");

        System.out.println(message); // 出力: Java is powerful
    }
}

このコードでは、replaceAllの結果を同じ変数messageに代入することで、文字列を更新しています。

5. 試験対策: 不変オブジェクトと文字列操作の理解

5. 試験対策: 不変オブジェクトと文字列操作の理解
5. 試験対策: 不変オブジェクトと文字列操作の理解

試験や実務で役立つポイントを以下にまとめます。

  • JavaのStringクラスは不変であり、元の値を変更することはできません。
  • 文字列を変更したい場合は、新しいStringオブジェクトを生成する必要があります。
  • replaceAllを使う場合は、戻り値を必ず受け取るようにしましょう。

6. メモリ上で何が起きているのか?

6. メモリ上で何が起きているのか?
6. メモリ上で何が起きているのか?

Stringの不変性を深く理解するために、メモリ内の動きをイメージしてみましょう。Javaでは文字列を「ヒープ領域」にある「文字列プール」という場所で管理しています。

既存の文字列を書き換えるのではなく、常に「新しい場所」に新しい文字列を作成します。


public class MemoryCheck {
    public static void main(String[] args) {
        String s1 = "Java";
        String s2 = s1; // s1と同じ場所を指す
        
        s1 = s1 + "8"; // "Java8"という新しい文字列が別の場所に作られる
        
        System.out.println(s1); // 出力: Java8
        System.out.println(s2); // 出力: Java (s2は元の場所を指したまま)
    }
}

もし String が可変(Mutable)だったら、s1 を書き換えた瞬間に s2 の値まで勝手に変わってしまい、プログラムは大混乱に陥るでしょう。この「勝手に変わらない安心感」こそが不変性の最大のメリットです。

7. replaceとreplaceAllの違い

7. replaceとreplaceAllの違い
7. replaceとreplaceAllの違い

初心者の方が迷いやすいのが replacereplaceAll の使い分けです。どちらも「置換して新しい文字列を返す」という不変のルールは同じですが、引数の扱いが異なります。

  • replace: 単純な文字や文字列をそのまま置換します。
  • replaceAll: 「正規表現」を使って、複雑なパターン(数字すべて、空白すべてなど)を置換できます。

public class ReplaceDiff {
    public static void main(String[] args) {
        String target = "A1B2C3";
        
        // 数字([0-9])をすべて * に変える
        String result = target.replaceAll("[0-9]", "*");
        
        System.out.println(result); // 出力: A*B*C*
    }
}

単純な一文字の入れ替えなら replace、特定のルールに基づいた一括置換なら replaceAll を選ぶのが、Javaプログラミングの定石です。

8. 大量に文字列を連結する場合の注意点

8. 大量に文字列を連結する場合の注意点
8. 大量に文字列を連結する場合の注意点

String は不変であるため、+ 演算子や replaceAll をループの中で何度も使うと、そのたびに新しいオブジェクトがメモリに作られ、動作が重くなる原因になります。

そのような「頻繁に書き換えたい」ケースでは、不変ではない(可変な) StringBuilder クラスを使用します。


public class BuilderExample {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Apple");
        
        sb.append(", Banana"); // 同じオブジェクトの中身を直接書き換える
        sb.append(", Orange");
        
        String result = sb.toString();
        System.out.println(result); // 出力: Apple, Banana, Orange
    }
}

基本は安全な String を使い、パフォーマンスが重要な場面では StringBuilder を使う。この使い分けができるようになれば、Javaの文字列マスターへの第一歩です!

まとめ

まとめ
まとめ

この記事では、JavaのStringクラスの不変性とreplaceAllメソッドについて詳しく学びました。Stringクラスが持つ不変オブジェクトの特性は、Javaプログラムの安全性と効率性を高める重要な仕組みです。以下に学んだポイントを振り返ります。

  • 不変性: Stringオブジェクトは一度作成されると変更されず、新しい文字列を扱うには新しいオブジェクトを生成する必要があります。
  • replaceAllメソッド: 置換結果は新しいStringオブジェクトとして返され、元の文字列は変更されません。
  • 戻り値の活用: 文字列の変更をプログラムに反映させるためには、replaceAllの戻り値を正しく利用する必要があります。

以下は、不変性とreplaceAllメソッドを組み合わせた実践的な例です。


public class FinalExample {
    public static void main(String[] args) {
        String greeting = "Good morning, everyone.";
        String updatedGreeting = greeting.replaceAll("morning", "afternoon");

        System.out.println("Original: " + greeting); // 出力: Good morning, everyone.
        System.out.println("Updated: " + updatedGreeting); // 出力: Good afternoon, everyone.
    }
}

この例では、元の文字列はそのまま残り、新しい文字列が生成されていることを確認できます。

先生と生徒の振り返り会話

生徒

replaceAllを使うと元の文字列がそのままで、新しい文字列ができる理由が分かりました!」

先生

「そうですね。Stringクラスは不変なので、新しい文字列を生成する仕組みがデータの安全性を保っています。」

生徒

「プログラムの効率も考えられているんですね。これからは戻り値を意識して使うようにします!」

先生

「その調子です!文字列操作を正しく理解することで、さらに効率的なプログラムが書けるようになりますよ。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

JavaのStringクラスが不変(immutable)である理由を教えてください。

JavaのStringクラスは不変(immutable)です。これはセキュリティ、安全性、メモリ効率、スレッドセーフ性を高めるための設計であり、一度作成した文字列は変更できません。

JavaのStringはなぜスレッドセーフと呼ばれているのですか?

不変オブジェクトであるため、複数のスレッドから同時にアクセスしても内容が変わらず、同期処理をしなくても安全に利用できるからです。

replaceAllメソッドを使っても元の文字列が変わらないのはなぜですか?

JavaのStringクラスは不変なので、replaceAllメソッドは元の文字列を変更せず、新しい文字列オブジェクトを生成して返すためです。

JavaのreplaceAllの戻り値を使わないと文字列が置換されない理由を教えてください。

replaceAllは新しい文字列を返すだけで、元のStringを変更しません。戻り値を受け取らずに処理すると、置換結果は反映されません。
JavaSilver試験対策の一覧へ
新着記事
Flutter
Flutterでのリポジトリパターンの実装例
Flutterでリポジトリパターンを実装する方法を完全解説!初心者向けアーキテクチャ設計入門
Java
Java の Objects クラスを使って null チェックを簡単にする方法
JavaのObjectsクラスの使い方を完全ガイド!nullチェックを簡単・安全に行う方法
Java
Java の UUID クラスを使って一意の識別子を作成する方法
JavaのUUIDクラスの使い方を完全ガイド!初心者でもわかる一意な識別子の作成方法
Java
Java の古い日付クラス(Date, Calendar)と新しい日付 API の違い
JavaのDateとCalendarと新しい日付APIの違いとは?初心者向け完全ガイド
人気記事
Java
Java の Random クラスを使ってランダムな数値を生成する方法
JavaのRandomクラスの使い方を完全ガイド!初心者でもわかる乱数生成
Java
Java の getter メソッドと setter メソッドの使い方
Javaのgetterメソッドとsetterメソッドの使い方を完全ガイド!初心者でもわかるアクセス方法
AWS
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
AWS
【AWS】VPCとは?初心者向けに仕組み・用途・できることをわかりやすく解説
【AWS】VPCとは?初心者向けに仕組み・用途・できることをわかりやすく解説

🔌 USBポート不足を解消

Type-C 1本で拡張。
開発・作業環境を一気に快適に

UGREEN USB-Cハブを見る

※ Amazon広告リンク