Java | 基礎文法:文字列リテラル

Java Java
スポンサーリンク

文字列リテラルの全体像

Java の文字列リテラルは、ダブルクォートで囲んだ "..." の形でコードに直接書くテキストです。型は String クラスで、不変(immutable)なので作成後の内容は変更されません。文字列リテラルは「定数」として扱われ、コンパイル時にまとめられたり、メモリ上で共有(文字列プール)されるため効率的です。繰り返し編集したい場合は、後述の StringBuilder を活用するとパフォーマンスとメモリ効率が向上します。


基本の書き方とエスケープ

代表的なエスケープシーケンス

文字列の中で特殊文字を表現するには、バックスラッシュでエスケープします。改行は \n、タブは \t、ダブルクォートは \"、バックスラッシュ自体は \\ で表します。これにより、見た目や制御文字を意図通りに埋め込めます。単一の Unicode 文字は \uXXXX で表現でき、ソースコードに直接入力しづらい文字や記号を安全に記述できます。

String s = "Line1\nLine2\t\"quote\"\\backslash";
String u = "\u3042"; // 'あ'
Java

文字列連結とコンパイル時定数

"Hello, " + "Java" のような「リテラル同士の連結」はコンパイル時に 1 つの定数へ折りたたまれます。変数を含む連結は実行時に結合されますが、単一式の連結はコンパイラが StringBuilder を使って最適化します。ループ内での都度連結はオブジェクトが増えるため、StringBuilder による明示的な連結へ切り替えるのが安全です。

String msg = "Hello, " + "Java"; // コンパイル時に "Hello, Java" へ
Java

equals と ==、文字列プール(重要ポイントの深掘り)

内容比較は equals、同一参照は ==

== は参照が同一か(同じインスタンスか)を比較し、equals は「内容が同じか」を比較します。文字列の比較は必ず equals を使いましょう。文字列リテラルはプールで共有されるため、同じリテラル同士は ==true になる場合もありますが、これは仕様に依存するため設計で当てにしないのが鉄則です。

String a = "hi";
String b = "hi";
String c = new String("hi");
System.out.println(a == b);       // たいてい true(プール共有)
System.out.println(a == c);       // false(別インスタンス)
System.out.println(a.equals(c));  // true(内容一致)
Java

不変性と安全性

String の不変性のおかげで、共有されても勝手に書き換えられる心配がありません。ログメッセージや定数ラベルなどは文字列リテラルで定義し、動的な生成や編集が必要な場合のみ StringBuilder を使ってから最終的に String に変換します。これが可読性・安全性・性能のバランスの良い王道パターンです。


テキストブロック(複数行リテラル)

複数行の埋め込みとインデント管理

Java 15 以降では、""" で囲むテキストブロックが使えます。複数行の文字列を自然な形で書け、インデントも整えやすくなります。内部のダブルクォートはエスケープ不要で、可読性が高いテンプレートや埋め込み JSON/SQL に最適です。

String json = """
{
  "name": "Java",
  "version": 21
}
""";
Java

テキストブロックは、行頭の共通インデントが自動で取り除かれます。「意図した見た目」を保つため、左端のインデントを揃えることを心がけると期待通りの文字列になります。

三重引用符そのものを含める

""" を文字列内に含めたい場合は、一続きの """ を避けるために間の 1 つをエスケープして "\"\"\"" の形にします。これにより、テキストブロックの終端と誤認されずに三連続の引用符を表現できます。

String quote = """
He said, "\"\"\"" (three quotes).
""";
Java

Unicode とコードポイント(重要ポイントの深掘り)

UTF-16 とサロゲートペア

String は内部的に UTF-16 を使います。絵文字などの一部の文字は「サロゲートペア」で 2 つの char に分かれるため、length() が「目に見える文字数」と一致しないことがあります。文字単位の安全な処理にはコードポイント API を使い、切り取りや反転などで文字化けを避けましょう。

String s = "A😊B";
System.out.println(s.length());                    // 4(😊が2単位)
System.out.println(s.codePointCount(0, s.length())); // 3(コードポイント)
Java

Unicode エスケープの前処理

\uXXXX は「字句解析前」に展開されるため、コメント中でも有効です。思わぬ構文崩れを招くことがあるので、コメントに Unicode エスケープを書くのは避け、必要なら通常の文字で記述するか、文字コードの扱いを明示する方が安全です。


分割、整形、置換の実用例

分割と整形表示

CSV などの分割には split を使い、出力は String.formatprintf で整形します。split は正規表現なので、メタ文字を区切りにする場合はエスケープを忘れないようにします。

String line = "INFO,2025-12-17,Login";
String[] parts = line.split(",");
System.out.printf("[%s] %s %s%n", parts[0], parts[1], parts[2]);
Java

置換と正規表現

単純置換は replace、正規表現の置換は replaceAll を使います。パターンの特殊記号(.* など)の意味を把握して、過剰マッチや不足マッチを避けましょう。

String masked = "user-1234".replaceAll("\\d", "*"); // "user-****"
Java

連結のパフォーマンスと StringBuilder

ループ内の連結は Builder を使う

ループで + による連結を繰り返すと、毎回新しい String が生成されて非効率です。StringBuilder に一度集めて最後に toString() することで、メモリ割り当てが減り高速になります。初期容量を見積もって指定すると、内部バッファの再拡張も減らせます。

StringBuilder sb = new StringBuilder(512);
for (int i = 0; i < 100; i++) {
    sb.append("item ").append(i).append('\n');
}
String result = sb.toString();
Java

例題で総復習

例 1: エスケープと改行の扱い

public class EscapeDemo {
    public static void main(String[] args) {
        String msg = "Path: C:\\Users\\Public\nHe said, \"Hello\".";
        System.out.println(msg);
    }
}
Java

ダブルクォート、バックスラッシュ、改行の基本的なエスケープの使い方が確認できます。Windows パスのようにバックスラッシュが多い場面では、エスケープ忘れによる誤解釈に注意します。

例 2: テキストブロックで JSON ひな型

public class JsonTemplate {
    public static void main(String[] args) {
        String json = """
        {
          "user": "sato",
          "roles": ["admin", "user"]
        }
        """;
        System.out.println(json);
    }
}
Java

複数行のテンプレートをそのままコードに書けるため、可読性が高くメンテナンスが容易です。テキストブロックはインデントの扱いに慣れるとより強力になります。

例 3: コードポイント安全なトリム(先頭 1 文字削除)

public class SafeTrim {
    public static void main(String[] args) {
        String s = "😊Java";
        int firstCp = s.codePointAt(0);
        int offset = Character.charCount(firstCp);
        String trimmed = s.substring(offset);
        System.out.println(trimmed); // "Java"
    }
}
Java

サロゲートペアを正しく扱い、絵文字などでも 1 文字単位の操作を安全に行えます。


設計の指針(重要ポイントのまとめ)

文字列リテラルは「定数」「テンプレート」「短いメッセージ」に使い、編集が必要なときは StringBuilder による組み立てに切り替えます。比較は常に equals を使い、== での一致は偶然に過ぎないと考えるのが安全です。テキストブロックで複数行を明快に書き、Unicode とコードポイントを意識すると多言語・絵文字を扱う場面での事故を防げます。エスケープは「必要な最小限」を正しく使い、正規表現の分割・置換ではメタ文字の意味に常に注意しましょう。

タイトルとURLをコピーしました