Javaの文字列操作は、ほとんどが String クラスのメソッド(split・replace・substring・strip など)と、連結用の StringBuilder・String.join、書式用の String.format・formatted の組み合わせで書けます。 まず下の早見表で「やりたいこと」からメソッドを探し、詳しい使い方は各セクションのコピペ用コードで確認してください。

この記事では、Java 21 の String の公開メソッドを一覧表にまとめ、Java 11〜21 で追加されたメソッドには追加バージョンを付けました。 さらに、split(".") が0件になる、replaceAll で $ を入れると例外になる、trim では全角スペースが消えない、絵文字で length() がずれる、といったつまずきやすい動きを、すべて Java 21(OpenJDK 21.0.10)で実行した出力つきで解説します。文字列の比較(equals と ==)は別記事で詳しく扱っているため、ここでは要点だけにとどめます。

Java 文字列操作の早見表(やりたいこと → メソッド)

やりたいこと 書き方 結果の例
カンマで分割 s.split(",") "a,b" → [a, b]
末尾の空要素も残して分割 s.split(",", -1) "a,," → [a, , ]
ドットで分割 s.split("\\.") "21.0.10" → [21, 0, 10]
リストを区切り文字で結合 String.join(",", list) [a, b] → "a,b"
ループで大量に連結 StringBuilder#append 速い(実測は後述)
文字どおり全部置換 s.replace("a", "b") 正規表現として扱わない
正規表現で置換 s.replaceAll("\\d+", "#") "a12" → "a#"
先頭の1件だけ置換 s.replaceFirst(regex, r) 正規表現
一部を取り出す s.substring(開始, 終了) 終了位置は含まない
1文字取り出す s.charAt(i) char を返す
含むか s.contains("x") true / false
位置を探す s.indexOf("x") / lastIndexOf 無ければ -1
先頭・末尾が一致 startsWith / endsWith true / false
大文字・小文字 toUpperCase() / toLowerCase() 必要なら Locale.ROOT
前後の空白を除去 s.strip()(Java 11) 全角スペースも除去
空か・空白だけか isEmpty() / isBlank()(Java 11) " ".isBlank() → true
ゼロ埋め String.format("%05d", n) 42 → "00042"
繰り返し "=".repeat(10)(Java 11) "=========="
文字列 → 数値 Integer.parseInt(s) 失敗時 NumberFormatException
数値 → 文字列 String.valueOf(n) 3.0 → "3.0"
文字数(見た目) s.codePointCount(0, s.length()) "𠮷野家" → 3
複数行の文字列 テキストブロック """(Java 15) JSONやSQLをそのまま書ける
中身が同じか a.equals(b) == は使わない

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Java 文字列操作 一覧|Java 21対応メソッド早見表と実行結果」

String メソッド一覧(Java 21)

Java 21 の java.lang.String の公開メソッドを用途別に並べました。 手元の JDK 21 で javap java.lang.String を実行して抜けがないことを確認し、追加バージョンは公式Javadocに合わせています。「追加」が空欄のものは Java 8 以前からあります。

用途 メソッド 説明 追加
長さ・空 length() / isEmpty() char数/長さ0か
isBlank() 空または空白だけか 11
取り出し charAt(i) / substring(b[, e]) / subSequence / toCharArray() 1文字・部分文字列・配列化
検索 indexOf / lastIndexOf / contains / startsWith / endsWith 位置(無ければ-1)・含むか
indexOf(ch, begin, end) / indexOf(str, begin, end) 範囲の終わりも指定 21
matches(regex) / regionMatches(...) 全体一致・部分同士の比較
比較 equals / equalsIgnoreCase / compareTo / compareToIgnoreCase / contentEquals 中身・辞書順の比較
置換 replace / replaceAll / replaceFirst 文字どおり/正規表現で置換
分割・結合 split(regex[, limit]) / concat / String.join 分割・連結 join は 8
splitWithDelimiters(regex, limit) 区切り文字も結果に含める 21
大小変換 toUpperCase / toLowerCase(Locale指定可) 大文字・小文字
空白除去 trim() U+0020以下の文字を除去
strip() / stripLeading() / stripTrailing() Unicodeの空白を除去 11
行・インデント lines() 行ごとのStream 11
indent(n) / stripIndent() インデントの増減/共通部分の除去 12 / 15
生成・変換 repeat(n) n回繰り返す 11
transform(f) 関数を適用 12
formatted(...) / translateEscapes() 書式化/\n 表記を実際の改行に 15
String.format / String.valueOf / copyValueOf 書式化・変換(static)
Unicode codePointAt / codePointBefore / codePointCount / offsetByCodePoints コードポイント単位の操作
chars() / codePoints() 1文字ずつのIntStream
その他 getBytes / getChars / intern / hashCode / describeConstable など バイト列化・プール登録など

あわせて使うもの:ループでの連結は StringBuilder(Java 21 で repeat を追加)、括弧付きの結合は StringJoiner / Collectors.joining、複数行の文字列はテキストブロック """(Java 15)、正規表現は Pattern / Matcher です。

実行環境

コードはすべて1ファイルのクラスとして java ファイル名.java で直接実行しました(OpenJDK 21.0.10、外部ライブラリなし)。日本語が ??? になるときは java -Dstdout.encoding=UTF-8 X.java で出力の文字コードを指定します。

文字列を分割する(split の limit と正規表現の罠)

split の引数は正規表現です。 そのため . や | はそのままでは「区切り文字」ではなく特別な意味になります。また limit を省略すると末尾の空文字が消えます。

import java.util.Arrays;

public class SplitDemo {
    public static void main(String[] args) {
        String csv = "りんご,みかん,,ぶどう,,";
        System.out.println(Arrays.toString(csv.split(",")));      // 既定(limit=0)
        System.out.println(Arrays.toString(csv.split(",", -1)));  // 末尾の空文字も残す
        System.out.println(Arrays.toString(csv.split(",", 2)));   // 最大2個に分割

        String ver = "21.0.10";
        System.out.println(ver.split(".").length);                // 「.」は正規表現で任意の1文字
        System.out.println(Arrays.toString(ver.split("\\.")));    // エスケープする

        System.out.println(Arrays.toString("a|b|c".split("|")));  // 「|」もメタ文字
        System.out.println(Arrays.toString("a|b|c".split("\|")));

        String[] e = "".split(",");                                // 空文字の分割
        System.out.println(e.length + " [" + e[0] + "]");

        // Java 21: 区切り文字も結果に含める
        System.out.println(Arrays.toString("1+2-3".splitWithDelimiters("[+-]", 0)));
    }
}

実行結果(Java 21):

[りんご, みかん, , ぶどう]
[りんご, みかん, , ぶどう, , ]
[りんご, みかん,,ぶどう,,]
0
[21, 0, 10]
[a, |, b, |, c]
[a, b, c]
1 []
[1, +, 2, -, 3]
書き方 動き 使いどころ
split(",")(limit=0) 末尾の空文字が消える(途中の空は残る) 空要素を気にしないとき
split(",", -1) 末尾の空文字も残す CSVなど列数を保ちたいとき
split(",", 2) 最大2個(残りは2個目に入る) 「キー=値」を最初の = で分ける
split(".") 全文字が区切り扱いになり 0件 split("\\.") か Pattern.quote(".") にする
split("|") 空文字に一致する正規表現になり1文字ずつに分かれる split("\\|") にする
"".split(",") 空文字1個の配列(長さ1) 空入力は先に isEmpty() で分岐

エスケープが必要な正規表現のメタ文字は . $ | ( ) [ ] { } ^ ? * + \ です。記号で分割するときは Pattern.quote(記号) を使うと、メタ文字かどうかを気にせずに済みます。

文字列を結合する(join・StringJoiner・+)

少数の連結は +、コレクションは String.join、前後に括弧を付けるなら Collectors.joining か StringJoiner が読みやすく書けます。

import java.util.List;
import java.util.StringJoiner;
import java.util.stream.Collectors;

public class JoinDemo {
    public static void main(String[] args) {
        List<String> items = List.of("ペン", "ノート", "付箋");
        System.out.println(String.join(", ", items));
        System.out.println(items.stream().collect(Collectors.joining(" / ", "[", "]")));
        StringJoiner sj = new StringJoiner(",", "{", "}");
        sj.setEmptyValue("(なし)");                // 要素0件のときの表示
        System.out.println(sj);
        System.out.println(sj.add("A").add("B"));
        System.out.println("備品" + 3 + "点");
    }
}

実行結果(Java 21):

ペン, ノート, 付箋
[ペン / ノート / 付箋]
(なし)
{A,B}
備品3点

文字列を置換する(replace と replaceAll の違い)

replace は文字どおり全部置換、replaceAll は正規表現で全部置換です。 名前から「replace は1件だけ」と思われがちですが、どちらも全件を置換します。1件だけなら replaceFirst を使います。

import java.util.regex.Matcher;

public class ReplaceDemo {
    public static void main(String[] args) {
        String s = "a.b.c";
        System.out.println(s.replace(".", "-"));      // 文字どおり置換
        System.out.println(s.replaceAll(".", "-"));   // 正規表現「任意の1文字」
        System.out.println(s.replaceAll("\\.", "-"));
        System.out.println(s.replaceFirst("\\.", "-"));
        System.out.println("2026-09-28".replaceAll("(\\d+)-(\\d+)-(\\d+)", "$1年$2月$3日"));

        // 置換後の文字列に $ や \ を含める
        String price = "価格: PRICE";
        System.out.println(price.replace("PRICE", "$100"));  // replace は $ をそのまま扱う
        System.out.println(price.replaceAll("PRICE", Matcher.quoteReplacement("$100")));
        try {
            System.out.println(price.replaceAll("PRICE", "$100"));
        } catch (Exception ex) {
            System.out.println(ex.getClass().getSimpleName() + ": " + ex.getMessage());
        }
        try {
            System.out.println(price.replaceAll("PRICE", "$"));
        } catch (Exception ex) {
            System.out.println(ex.getClass().getSimpleName() + ": " + ex.getMessage());
        }
    }
}

実行結果(Java 21):

a-b-c
-----
a-b-c
a-b.c
2026年09月28日
価格: $100
価格: $100
IndexOutOfBoundsException: No group 1
IllegalArgumentException: Illegal group reference: group index is missing
メソッド 検索する文字列 置換後の $ \ 件数
replace(a, b) 文字どおり そのまま出力 全部
replaceAll(regex, r) 正規表現 $1 はグループ参照 全部
replaceFirst(regex, r) 正規表現 $1 はグループ参照 最初の1件

置換後の文字列がユーザー入力など「中身がわからない値」なら、replace を使うか Matcher.quoteReplacement で包むと、$ を含んでいても例外になりません。

一部を取り出す・検索する(substring・indexOf・contains)

substring(開始, 終了) は「開始を含み、終了を含まない」範囲を返します。「含むか」だけなら contains、位置が必要なら indexOf(無ければ -1)を使います。Java 21 では indexOf に検索範囲の終わりも渡せます。

public class SubSearch {
    public static void main(String[] args) {
        String file = "report_2026-09.final.csv";
        System.out.println(file.substring(7));             // 7文字目以降
        System.out.println(file.substring(0, 6));          // [0,6)
        System.out.println(file.charAt(0));
        int dot = file.lastIndexOf('.');
        System.out.println(file.substring(dot + 1));       // 拡張子
        System.out.println(file.substring(0, dot));        // 拡張子なし
        System.out.println(file.indexOf(".") + " " + file.indexOf("xyz"));
        System.out.println(file.contains("2026") + " " + file.startsWith("report") + " " + file.endsWith(".csv"));
        System.out.println(file.matches("report_\\d{4}-\\d{2}.*"));   // 全体一致
        System.out.println(file.indexOf('.', 0, 10));       // Java 21:[0,10) の範囲で検索
        System.out.println(file.chars().filter(c -> c == '.').count()); // 出現回数
        try {
            System.out.println(file.substring(5, 100));
        } catch (StringIndexOutOfBoundsException ex) {
            System.out.println(ex.getMessage());
        }
    }
}

実行結果(Java 21):

2026-09.final.csv
report
r
csv
report_2026-09.final
14 -1
true true true
true
-1
2
Range [5, 100) out of bounds for length 24

範囲外を指定すると StringIndexOutOfBoundsException になります。長さが決まっていない入力は Math.min(end, s.length()) で切り詰めると安全です。また matches は文字列全体が一致するかの判定です。部分一致は Pattern.compile(regex).matcher(s).find() で調べます。

大文字・小文字を変換する(Locale に注意)

toUpperCase() / toLowerCase() は実行環境のロケールの影響を受けます。 IDやキーなど、言語に関係なく同じ結果にしたい文字列は Locale.ROOT を指定すると安定します。

import java.util.Locale;

public class CaseDemo {
    public static void main(String[] args) {
        System.out.println("Order-Id".toUpperCase() + " " + "Order-Id".toLowerCase());
        System.out.println("TITLE".toLowerCase(Locale.ROOT));
        System.out.println("TITLE".toLowerCase(Locale.forLanguageTag("tr")));  // トルコ語
        System.out.println("java".toUpperCase());                         // 全角英字も変換
        String w = "hello";
        System.out.println(Character.toUpperCase(w.charAt(0)) + w.substring(1)); // 先頭だけ大文字
    }
}

実行結果(Java 21):

ORDER-ID order-id
title
tıtle
JAVA
Hello

トルコ語では I が点のない ı になります。比較やキー用の変換には Locale.ROOT を付けておくと、サーバーの設定に左右されません。

空白を除去する(trim と strip の違いを全角スペースで確認)

trim() は半角スペースや制御文字(U+0020以下)だけを除去し、strip()(Java 11〜)は全角スペースを含むUnicodeの空白を除去します。 日本語の入力を扱うなら strip() が向いています。

public class TrimStripDemo {
    public static void main(String[] args) {
        String s = "  在庫あり  ";   // 両端に全角スペース+半角スペース
        System.out.println("[" + s.trim() + "]");
        System.out.println("[" + s.strip() + "]");
        System.out.println(s.trim().length() + " / " + s.strip().length());

        // 空チェック
        System.out.println("".isEmpty() + " " + " ".isEmpty() + " " + " ".isBlank() + " " + " ".isBlank());

        // 途中の空白もすべて消す
        System.out.println("タ ス ク".replaceAll("\\s", ""));       // 半角スペースだけ消える
        System.out.println("タ ス ク".replaceAll("(?U)\\s", ""));   // (?U) を付けると全角スペースも消える
    }
}

実行結果(Java 21):

[  在庫あり  ]
[在庫あり]
8 / 4
true false true true
タス ク
タスク
メソッド 全角スペース 対象 追加
trim() 残る U+0020以下の文字
strip() 消える Character.isWhitespace が真の文字 11
isBlank() 空白とみなす 空白だけなら true 11
replaceAll("(?U)\\s", "") 消える 途中も含めて全部

正規表現の \s は既定では半角の空白だけです。(?U)(UNICODE_CHARACTER_CLASS)を付けると全角スペースも対象になります。

ゼロ埋め・パディング・書式(format と formatted)

ゼロ埋めや桁そろえは String.format、Java 15 以降は "書式".formatted(値) とも書けます。

public class FormatDemo {
    public static void main(String[] args) {
        System.out.println("[" + String.format("%5s", "ab") + "][" + String.format("%-5s", "ab") + "]");
        System.out.println(String.format("%05d", 42));
        System.out.println("%08.3f".formatted(3.14159));
        System.out.println(String.format("%,d", 1234567));
        System.out.println(String.format("%x / %o", 255, 8));
        System.out.println("%-6s|%4d|".formatted("ペン", 12));
    }
}

実行結果(Java 21):

[   ab][ab   ]
00042
0003.142
1,234,567
ff / 10
ペン    |  12|
書式 意味 書式 意味
%5s / %-5s 幅5で右寄せ/左寄せ %,d 3桁区切り
%05d 幅5でゼロ埋め %.2f 小数2桁に丸め
%x / %o 16進数/8進数 %n 改行(OSに合わせる)

%-6s の幅は文字数で数えるため、全角文字は見た目の幅がそろいません(上の ペン |)。見た目をそろえたいときは全角を2として幅を計算する処理を別に用意します。

数値と文字列を変換する

文字列 → 数値は Integer.parseInt / Long.parseLong / Double.parseDouble、数値 → 文字列は String.valueOf が基本です。変換できないと NumberFormatException になります。

public class NumberDemo {
    public static void main(String[] args) {
        System.out.println(Integer.parseInt("123") + 1);
        System.out.println(Integer.parseInt("ff", 16));
        System.out.println(Integer.parseInt("123"));             // 全角数字
        for (String in : new String[]{"12a", " 12", "3000000000"}) {
            try {
                Integer.parseInt(in);
            } catch (NumberFormatException ex) {
                System.out.println(ex.getMessage());
            }
        }
        System.out.println(Integer.parseInt(" 12 ".strip()));
        System.out.println(String.valueOf(3.0) + " " + Integer.toString(255, 2));
        System.out.println(0.1 + 0.2 + "");
    }
}

実行結果(Java 21):

124
255
123
For input string: "12a"
For input string: " 12"
For input string: "3000000000"
12
3.0 11111111
0.30000000000000004
入力 結果 対処
" 12"(前後に空白) 例外 先に strip() する
"3000000000"(int範囲外) 例外 Long.parseLong を使う
"123"(全角数字) 123 に変換される 半角だけ受け付けるなら先に matches("[0-9]+") で検査
0.1 + 0.2 を文字列化 0.30000000000000004 表示は String.format("%.2f")、計算は BigDecimal

文字数を数える(length と codePointCount の違い)

length() は「UTF-16のchar数」で、見た目の文字数とは限りません。 「𠮷(つちよし)」や絵文字はサロゲートペア(2つのcharで1文字を表す仕組み)なので、length() では2と数えられます。

import java.nio.charset.StandardCharsets;
import java.text.BreakIterator;

public class UnicodeLen {
    public static void main(String[] args) {
        for (String s : new String[]{"あいう", "𠮷野家", "👍", "👨‍👩‍👧"}) {
            BreakIterator it = BreakIterator.getCharacterInstance();  // 見た目の1文字(書記素)
            it.setText(s);
            int g = 0;
            while (it.next() != BreakIterator.DONE) g++;
            System.out.printf("%s length=%d codePointCount=%d grapheme=%d bytes=%d%n",
                    s, s.length(), s.codePointCount(0, s.length()), g,
                    s.getBytes(StandardCharsets.UTF_8).length);
        }
        String s = "𠮷野家";
        System.out.println(s.substring(0, 1).equals("𠮷"));          // 半分に切れる
        System.out.println(s.substring(0, s.offsetByCodePoints(0, 1)));
        System.out.println(new StringBuilder("A𠮷B").reverse());       // ペアを保って反転
    }
}

実行結果(Java 21):

あいう length=3 codePointCount=3 grapheme=3 bytes=9
𠮷野家 length=4 codePointCount=3 grapheme=3 bytes=10
👍 length=2 codePointCount=1 grapheme=1 bytes=4
👨‍👩‍👧 length=8 codePointCount=5 grapheme=1 bytes=18
false
𠮷
B𠮷A
数え方 「𠮷野家」 家族の絵文字 使いどころ
length() 4 8 char数の上限チェック
codePointCount 3 5 Unicodeの文字数
BreakIterator(書記素) 3 1 画面に見える文字数
getBytes(UTF_8).length 10 18 バイト数の上限チェック

char単位で substring(0, 1) とすると、サロゲートペアが半分に切れます。 先頭N文字を取るときは offsetByCodePoints で位置を求めます。

Java 11〜21 の便利な書き方(テキストブロック・lines・repeat など)

Java 11 以降に追加されたメソッドを使うと、複数行の文字列やインデント処理が短く書けます。

import java.util.stream.Collectors;

public class NewApis {
    public static void main(String[] args) {
        // テキストブロック(Java 15)
        String json = """
            {
              "task": "棚卸し",
              "done": false
            }
            """;
        System.out.print(json);

        // formatted(Java 15)とテキストブロックの組み合わせ
        String sql = """
            SELECT id, name
            FROM items
            WHERE stock < %d
            """.formatted(10);
        System.out.print(sql);

        // 行末の \ で改行しない、\s で行末スペースを残す
        String oneLine = """
            在庫は\
            十分です\s""";
        System.out.println("[" + oneLine + "]");

        // lines(Java 11):行ごとに処理
        System.out.println("A\nB\r\nC".lines().map(l -> "- " + l).collect(Collectors.joining(",")));
        // repeat(Java 11)
        System.out.println("=".repeat(10));
        // translateEscapes(Java 15):\n などの文字列表現を実際の文字に
        String raw = "1行目\\n2行目";
        System.out.println(raw.translateEscapes());
        // transform(Java 12):関数を順に適用
        int len = " 注文番号 ".transform(String::strip).transform(String::length);
        System.out.println(len);
        // StringBuilder.repeat(Java 21)
        System.out.println(new StringBuilder("|").repeat("-", 3).repeat('*', 2).append("|"));
    }
}

実行結果(Java 21):

{
  "task": "棚卸し",
  "done": false
}
SELECT id, name
FROM items
WHERE stock < 10
[在庫は十分です ]
- A,- B,- C
==========
1行目
2行目
4
|---**|

テキストブロックは、閉じの """ の位置を基準に共通のインデントが自動で取り除かれます。 上の例では、ソースコード上の字下げが消えて { が行頭から始まっています。lines() は \n と \r\n のどちらでも行を分けてくれるので、OSをまたぐテキストの処理に便利です。

StringBuilder で連結を速くする(+ との速度を実測)

ループの中で文字列を少しずつ足していく処理は、+ ではなく StringBuilder を使います。 String は変更できない(イミュータブル)ため、s += "x" のたびに新しい文字列が作られ、長さに比例したコピーが発生するからです。

public class ConcatBench {
    static String plus(int n) {
        String s = "";
        for (int i = 0; i < n; i++) s += "x";
        return s;
    }
    static String builder(int n) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) sb.append("x");
        return sb.toString();
    }
    public static void main(String[] args) {
        int[] sizes = {1_000, 10_000, 100_000};
        // ウォームアップ
        for (int i = 0; i < 5; i++) { plus(5_000); builder(5_000); }
        for (int n : sizes) {
            long t0 = System.nanoTime();
            String a = plus(n);
            long t1 = System.nanoTime();
            String b = builder(n);
            long t2 = System.nanoTime();
            System.out.printf("n=%,7d  + 演算子: %8.2f ms   StringBuilder: %6.3f ms   同じ結果=%b%n",
                    n, (t1 - t0) / 1e6, (t2 - t1) / 1e6, a.equals(b));
        }
    }
}

実行結果(Java 21、2コアのコンテナ、1回目):

n=  1,000  + 演算子:     0.10 ms   StringBuilder:  0.032 ms   同じ結果=true
n= 10,000  + 演算子:    94.99 ms   StringBuilder:  0.366 ms   同じ結果=true
n=100,000  + 演算子:  2000.24 ms   StringBuilder:  6.872 ms   同じ結果=true

同じプログラムを3回実行したところ、10万回の連結は + が約2.0〜4.3秒、StringBuilder が約3〜13ミリ秒でした(環境により数値は変わります)。回数が10倍になると + の時間はおよそ20倍以上に伸びるのに対し、StringBuilder はほぼ回数に比例します。

使い分けの目安:"ID:" + id + "件" のような1文の連結は + で十分速く、ループで少しずつ足すときだけ StringBuilder にします。

文字列の比較は equals(要点のみ)

文字列の中身を比べるときは == ではなく equals を使います。 == は同じオブジェクトかどうかを比べるためです。nullの可能性があるなら Objects.equals(a, b)、大文字・小文字を無視するなら equalsIgnoreCase、並べ替えには compareTo を使います。詳しい仕組みと実行結果は「Javaの文字列比較|equalsと==の違い」の記事で解説しています。

よくある質問

Q. split で空の要素が消えてしまいます。どうすれば残せますか? A. 第2引数に -1 を渡して split(",", -1) と書きます。 limit を省略(0)すると末尾の空文字だけが削除されます。途中の空要素は limit に関係なく残ります。

Q. replace と replaceAll はどちらを使えばよいですか? A. 正規表現を使わないなら replace が安全です。 どちらも全件を置換します。replaceAll は第1引数が正規表現、第2引数の $ がグループ参照になるため、記号を含む文字列ではエスケープが必要です。

Q. trim と strip はどちらを使うべきですか? A. Java 11 以降なら strip がおすすめです。 日本語入力でよく混ざる全角スペースも除去できます。U+0020以下の制御文字だけを除きたい既存処理では trim のままでも問題ありません。

Q. 文字数制限のチェックには length() を使えばよいですか? A. 何を数えたいかで選びます。 DBのカラム長がchar数なら length()、Unicodeの文字数なら codePointCount、画面に見える文字数なら BreakIterator を使います。絵文字を含む入力では3つの結果が異なります。

まとめ

  • 文字列操作は String のメソッドと StringBuilder・String.join・String.format の組み合わせでほぼ書ける
  • split は正規表現。. や | はエスケープし、末尾の空要素を残すなら split(",", -1)
  • replace も replaceAll も全件置換。正規表現が不要なら replace、$ を含む値は Matcher.quoteReplacement
  • 全角スペースの除去は strip()(Java 11〜)。trim() では残る
  • length() はchar数。見た目の文字数は codePointCount や BreakIterator で数える
  • ループでの連結は StringBuilder。10万回で + の数百倍速い結果になった
  • Java 11〜21 の isBlank・repeat・lines・テキストブロック・formatted でコードが短くなる

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Java 文字列操作 一覧|Java 21対応メソッド早見表と実行結果」

株式会社RJCでは、こうした言語の基本を実際に動かして確かめる習慣を、プロジェクトの中で仲間と共有しています。こうした知識を共有しながら、日々技術を磨いています。

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?