1.

文字列API

編集

本稿は Java の文字列に関する API をまとめた記事です。Java で文字列を扱うときの中心は String クラスで、ほかに可変文字列を扱う StringBuilder / StringBuffer、文字列の比較・抽出・分割・整形のためのメソッド・正規表現があります。

子ページから個別の API を選択してください。

本ページの子ページ

String / StringBuilder / StringBuffer の違い

クラス不変かスレッドセーフ用途
String不変スレッドセーフ通常の文字列 (ほとんどはこれ)
StringBuilder可変スレッドセーフでない同一スレッド内で大量の連結
StringBuffer可変スレッドセーフ (synchronized)複数スレッドで共有する場合

よく使う String のメソッド

メソッド用途
length()文字数 (Java の char 単位)
isEmpty() / isBlank()空 / 空白のみ判定 (isBlank は Java 11+)
equals(s) / equalsIgnoreCase(s)等価比較
compareTo(s)辞書順比較
startsWith(p) / endsWith(p)接頭辞・接尾辞判定
contains(c)部分一致
indexOf(c) / lastIndexOf(c)位置
charAt(i)i 番目の文字
substring(b, e)部分文字列
toUpperCase() / toLowerCase()大小変換
trim() / strip()前後空白除去 (strip は Unicode 対応; Java 11+)
replace(c1, c2) / replaceAll(re, s)置換
split(re)正規表現で分割
concat(s)連結 (基本は + でよい)
format(fmt, ...)書式文字列 (%d%s 等)
chars() / codePoints()文字 Stream / コードポイント Stream
matches(re)正規表現と完全一致するか
String.join(d, ...)区切り文字で結合
String.valueOf(x)他の型を文字列に

連結の効率

// 単純な連結 (短い・少回数なら + で OK)
String s = "Hello, " + name + "!";

// ループでの大量連結は StringBuilder
StringBuilder sb = new StringBuilder();
for (String w : words) {
    sb.append(w).append(",");
}
String csv = sb.toString();

書式付き整形 (printf / format)

String s = String.format("%-10s = %,d", "count", 1234567);
// "count      = 1,234,567"

System.out.printf("%5.2f%n", 3.14159);  //  3.14

正規表現 (java.util.regex)

import java.util.regex.*;

Pattern p = Pattern.compile("(\\\\d{3})-(\\\\d{4})");
Matcher m = p.matcher("Tel: 090-1234");
if (m.find()) {
  System.out.println(m.group(0)); // 090-1234
  System.out.println(m.group(1)); // 090
}

// 置換
String redacted = "ID: 12345".replaceAll("\\\\d+", "***");

文字列の比較 (== と equals)

String a = "hello";
String b = new String("hello");

System.out.println(a == b);       // false (参照比較)
System.out.println(a.equals(b));  // true  (内容比較)
System.out.println(Objects.equals(a, b)); // true (null 安全)

新世代の文字列機能

Java バージョン機能
Java 11isBlank()strip()lines()repeat(n)
Java 12indent(n)transform(fn)
Java 13〜テキストブロック """ ... """
Java 15テキストブロックが正式機能

String json = """
  {
    "name": "Taro",
    "age": 20
  }
""";

注意点

  • String不変。連結ごとに新しい String が作られる
  • 大量連結は StringBuilder+= ループはアンチパターン
  • String.length()char (UTF-16) 単位。サロゲートペア (絵文字) では実文字数と一致しない (codePointCount を使う)
  • == でなく equals。null チェックは Objects.equals または "literal".equals(x)
  • 正規表現のバックスラッシュは二重 (\\\\d)
  • 個人情報・パスワードを String に保持するとGCまでメモリに残る。秘密情報は char[] で扱い、使用後ゼロクリアするのが堅い

関連

編集
Post Share
子ページ
  1. Strint.equals
  2. String.equalsIgnoreCase
  3. StringBuffer
  4. String.length
  5. String.trim
同階層のページ
  1. 文字列API
  2. 日時API
  3. ストリームAPI
  4. サーブレットAPI