Java/基礎/文字列
表示
< Java
文字列
[編集]プログラミングにおける文字列(String)は、文字の連続した列を表すデータ型です。文字列は、テキストや文字データを扱うための基本的なデータ構造であり、多くのプログラミング言語でサポートされています。
概要
[編集]文字列は、文字の配列として内部的に表現されます。各文字は、主にUnicodeやASCIIなどの文字コードで符号化され、文字列全体はそれらの文字の連続したシーケンスとして表現されます。
主な用途
[編集]文字列は、以下のような多様な用途で使用されます:
- テキスト処理
- ユーザー入力の処理
- ファイルの読み書き
- テキストの検索、置換、分割
- 正規表現によるパターンマッチング
- データ表現
- JSONやXMLなどの構造化データ
- URLやファイルパス
- 設定ファイルの内容
- データベースクエリ
- 出力とフォーマット
- ログメッセージ
- 多言語対応(i18n)テキスト
- レポート生成
- テンプレート処理
Javaの文字列
[編集]Javaの文字列はjava.lang.String
クラスで実装される不変(イミュータブル)なオブジェクトです。
文字とエンコーディング
[編集]Javaの文字列では、文字はUnicodeで表現されます:
- 文字の内部表現
- 基本的な文字は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
パフォーマンスと最適化
[編集]文字列処理を効率的に行うためのベストプラクティス:
- StringBuilder の使用
- 大量の文字列結合には
StringBuilder
を使用 String + String
の代わりにStringBuilder.append()
を使用
- 大量の文字列結合には
- 適切な文字処理
- サロゲートペアを含む可能性がある場合は
codePoints()
を使用 - 文字数のカウントには
codePointCount()
を使用
- サロゲートペアを含む可能性がある場合は
- メモリ効率
- コンパクト文字列(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 (実際の文字数) } }