- JAVA
Java 文字列操作 一覧|Java 21対応メソッド早見表と実行結果
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期連続の黒字決算。