コンテンツにスキップ

Java/基礎/文字列

出典: フリー教科書『ウィキブックス(Wikibooks)』

文字列

[編集]

プログラミングにおける文字列(String)は、文字の連続した列を表すデータ型です。文字列は、テキストや文字データを扱うための基本的なデータ構造であり、多くのプログラミング言語でサポートされています。

概要

[編集]

文字列は、文字の配列として内部的に表現されます。各文字は、主にUnicodeやASCIIなどの文字コードで符号化され、文字列全体はそれらの文字の連続したシーケンスとして表現されます。

主な用途

[編集]

文字列は、以下のような多様な用途で使用されます:

  1. テキスト処理
    • ユーザー入力の処理
    • ファイルの読み書き
    • テキストの検索、置換、分割
    • 正規表現によるパターンマッチング
  2. データ表現
    • JSONやXMLなどの構造化データ
    • URLやファイルパス
    • 設定ファイルの内容
    • データベースクエリ
  3. 出力とフォーマット
    • ログメッセージ
    • 多言語対応(i18n)テキスト
    • レポート生成
    • テンプレート処理

Javaの文字列

[編集]

Javaの文字列はjava.lang.Stringクラスで実装される不変(イミュータブル)なオブジェクトです。

文字とエンコーディング

[編集]

Javaの文字列では、文字はUnicodeで表現されます:

  1. 文字の内部表現
    • 基本的な文字は16ビットのchar型で表現
    • サロゲートペアを必要とする文字(絵文字や特殊な漢字など)は2つのchar値で表現
    • 文字列長(length())はchar単位で計算されるため、サロゲートペアは2とカウント
public class StringEncodingExample {
    public static void main(String[] args) {
        // サロゲートペアを含む文字列
        String text = "𠮷野家";  // "𠮷"は1文字だがサロゲートペア
        
        System.out.println("文字列の長さ: " + text.length());  // 4を表示("𠮷"が2文字分)
        
        // コードポイント単位での処理
        System.out.println("実際の文字数: " + text.codePointCount(0, text.length()));  // 3を表示
        
        // 文字列内の各文字(コードポイント)を処理
        text.codePoints().forEach(codePoint -> {
            System.out.printf("U+%04X ", codePoint);  // Unicode コードポイントを16進数で表示
        });
    }
}

文字列操作の基本

[編集]

以下は最新のJava(Java 17以降)での文字列操作の基本例です:

public class ModernStringExample {
    public static void main(String[] args) {
        // テキストブロック(Java 15以降)
        String multiLine = """
                複数行の
                テキストを
                自然に書けます。
                """;
        
        // 文字列結合(Java 11以降のrepeat())
        String repeated = "Hello ".repeat(3);
        
        // 空白処理(Java 11以降)
        String text = "  Hello, World!  ";
        System.out.println(text.strip());      // 前後の空白を除去(Unicode対応)
        System.out.println(text.trim());       // 従来の空白除去
        System.out.println("".isBlank());      // true(空または空白文字のみ)
        
        // 文字列変換(Java 17以降)
        String transformed = text
            .transform(String::strip)
            .transform(String::toUpperCase);
        
        // 行単位の処理(Java 11以降)
        multiLine.lines()
                .map(String::trim)
                .filter(line -> !line.isBlank())
                .forEach(System.out::println);
    }
}

メソッド一覧

[編集]
主要な文字列メソッド
メソッド 説明 導入バージョン
codePointAt(int index) 指定位置のUnicodeコードポイントを取得 Java 5
codePointCount(int begin, int end) 指定範囲のコードポイント数を取得 Java 5
strip() Unicode対応の空白除去 Java 11
isBlank() 空白文字のみかを判定 Java 11
transform(Function<String,R> f) 文字列に関数を適用 Java 17
indent(int n) 行のインデントを調整 Java 17

パフォーマンスと最適化

[編集]

文字列処理を効率的に行うためのベストプラクティス:

  1. StringBuilder の使用
    • 大量の文字列結合にはStringBuilderを使用
    • String + Stringの代わりにStringBuilder.append()を使用
  2. 適切な文字処理
    • サロゲートペアを含む可能性がある場合はcodePoints()を使用
    • 文字数のカウントにはcodePointCount()を使用
  3. メモリ効率
    • コンパクト文字列(Java 9以降): ASCII文字のみの場合、内部的に1バイト/文字で格納
    • 文字列プール: intern()メソッドによる文字列の共有
public class StringPerformanceExample {
    public static void main(String[] args) {
        // 効率的な文字列結合
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 1000; i++) {
            sb.append("Item ").append(i).append(", ");
        }
        String result = sb.toString();
        
        // サロゲートペアを含む文字列の適切な処理
        String text = "🌟Hello🌍";  // 絵文字を含む
        int charCount = text.length();                    // 文字単位(不適切)
        int codePoints = text.codePointCount(0, text.length());  // 実際の文字数(適切)
        
        System.out.println("char count: " + charCount);         // 7 (各絵文字が2文字としてカウント)
        System.out.println("actual count: " + codePoints);      // 5 (実際の文字数)
    }
}