4.

Java String.length()の使い方|UTF-16コードユニットとサロゲートペア

編集
この記事の要点
  • String.length() は文字列の長さ(UTF-16 コードユニット数)int で返すインスタンスメソッド
  • 末尾の改行コード(\n / \r\n)も1 文字としてカウントされる
  • 配列の lengthフィールドString.length()メソッド(カッコ必須)で違う
  • 絵文字や一部の漢字はサロゲートペアになり、length() では 2 とカウントされる。実際の文字数は codePointCount で取得する

定義

修飾子と型メソッドと説明
public intlength()
文字列の長さ(UTF-16 コードユニット数)を返す

基本的な使い方

String s = "Hello";
System.out.println(s.length());   // 5

String empty = "";
System.out.println(empty.length()); // 0

String japanese = "あいうえお";
System.out.println(japanese.length()); // 5

BMP(Basic Multilingual Plane)内の漢字・かな・英字は 1 文字 = 1 コードユニットなので、見たままの文字数になります。

改行コードに注意

末尾の \n\r\n文字としてカウントされます。ファイルや標準入力から 1 行読んだだけのつもりが、想定より 1〜2 多い、というのは典型的なバグです。

String a = "abc\n";
System.out.println(a.length()); // 4  ← \n も 1 つ

String b = "abc\r\n";
System.out.println(b.length()); // 5  ← \r と \n で 2 つ

改行コードを取り除く方法は 改行コードの削除 を参照してください。Java 11+ なら String.strip() で前後の空白・改行を一括除去できます。

String trimmed = "abc\r\n".strip();
System.out.println(trimmed.length()); // 3

サロゲートペアと codePointCount

絵文字や一部の漢字(𠮷 など)は Unicode コードポイントとしては 1 文字ですが、UTF-16 では2 つのコードユニット(サロゲートペア)で表現されます。length() はコードユニット数を返すため、こうした文字は2 とカウントされます

String emoji = "😀";
System.out.println(emoji.length()); // 2  ← サロゲートペア

// 実際のコードポイント数(≒ 人間が見た文字数)
int real = emoji.codePointCount(0, emoji.length());
System.out.println(real); // 1

「実際の文字数」が欲しい場合は codePointCount を使います。書記素クラスター(家族絵文字や肌の色付き絵文字)まで含めて 1 単位として数えたい場合は java.text.BreakIterator が必要です。

配列の length との違い

初学者が混同しがちなポイントです。

対象記述種類
文字列str.length()メソッド(カッコ必須)
配列arr.lengthフィールド(カッコ不要)
List / Maplist.size()メソッド(カッコ必須)
String s = "abc";
int[] a   = {1, 2, 3};
List<Integer> l = List.of(1, 2, 3);

s.length();   // OK
// s.length    // コンパイルエラー

a.length;     // OK
// a.length()  // コンパイルエラー

l.size();     // OK

パフォーマンス

String.length() は内部の文字配列の長さフィールドを返すだけの O(1) 操作です。ループの終了条件に書いても問題ありませんが、可読性のためにループ前に変数へ取り出すのも一般的です。

for (int i = 0, n = s.length(); i < n; i++) {
    // ... s.charAt(i)
}

長さ系メソッドの一覧

メソッド意味
length()UTF-16 コードユニット数
isEmpty()length() == 0 と等価
isBlank() (Java 11+)空 or 空白のみなら true
codePointCount(begin, end)区間内のコードポイント数
getBytes(charset).length指定文字コードでのバイト数

関連

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. String.equals
  2. String.equalsIgnoreCase(大文字小文字を無視した等値比較)
  3. StringBuffer
  4. String.length
  5. String.trim

最近更新/作成されたページ