1. メソッド length(): 文字列の長さは?
length() メソッドは文字列の文字数を返します。これは「バイト数」とは必ずしも同じではありません(特に絵文字や Unicode 文字が含まれる場合)が、ほとんどの用途ではこれで十分です。
使用例
String name = "Vasilisa";
int length = name.length();
System.out.println("名前の文字数: " + length); // 8
なぜ必要か
- ユーザーが空文字列を入力していないか確認する。
- パスワードの最小/最大長を検証する。
- 制限までに残り何文字かを知る(SMS やツイートなど)。
例: 空文字チェック
String input = "";
if (input.length() == 0)
{
System.out.println("文字列は空です!");
}
豆知識: 文字列が「空」かどうかを調べるには isEmpty() も使えます。詳細は後ほど。
短い FAQ
- メソッド length() は引数を取りません(かっこは常に空)。
- 文字列がスペースだけでも、それらも文字として数えられます!
- 文字列が null の場合に length() を呼ぶと NullPointerException が発生します—まず null を確認しましょう。
2. メソッド substring(): 文字列の一部を取り出す
substring() メソッドは、指定したインデックスで部分文字列を取得できます。
主な呼び出し方は 2 つあります:
- str.substring(startIndex) — 位置 startIndex から文字列の末尾まで。
- str.substring(startIndex, endIndex) — 位置 startIndex から endIndex まで(endIndex の文字は含まない)。
注意: 文字のインデックスは 0 から始まります。
使用例
例 1: 名前の最初の3文字を取得
String name = "Vasilisa";
String firstThree = name.substring(0, 3); // "Vas"
System.out.println(firstThree);
例 2: ファイル拡張子を取得
String fileName = "document.pdf";
int dotIndex = fileName.indexOf(".");
String extension = fileName.substring(dotIndex + 1); // "pdf"
System.out.println(extension);
例 3: 末尾4文字
String cardNumber = "1234567890123456";
String lastFour = cardNumber.substring(cardNumber.length() - 4); // "3456"
System.out.println("末尾の4桁: " + lastFour);
特徴と注意点
- 不正なインデックス(startIndex < 0、endIndex > 長さ、startIndex > endIndex)は StringIndexOutOfBoundsException を引き起こします。
- 常に新しい文字列を返します—元の文字列は変化しません。
- 2 つの引数の形式では、endIndex の文字は含まれません。
String str = "abcdef";
// インデックス: 0 1 2 3 4 5
str.substring(1, 4) → "bcd" // インデックス 1, 2, 3 の文字
substring(start, end) の動作図
3. メソッド indexOf(): 文字や部分文字列を検索
indexOf() メソッドは、指定した文字または部分文字列の最初の出現位置(インデックス)を検索します。
- 見つかった場合 — インデックス(0 から)を返します。
- 見つからない場合 — -1 を返します。
使用例
例 1: email の最初のドットを見つける
String email = "ivan.petrov@mail.com";
int dotIndex = email.indexOf('.');
System.out.println("最初のドットの位置: " + dotIndex); // 4
例 2: 部分文字列を見つける
String text = "I love Java!";
int index = text.indexOf("Java");
System.out.println(index); // 7
例 3: 指定位置の後で文字を探す
String s = "abracadabra";
int firstA = s.indexOf('a'); // 0
int secondA = s.indexOf('a', firstA + 1); // 3
System.out.println("2 番目の 'a' の位置: " + secondA);
特徴と注意点
- 同じ文字/部分文字列が複数回出現する場合、最初の出現位置のインデックスを返します。
- 最後の出現を検索するには lastIndexOf() を使います。
- 文字は単一引用符 'a'、部分文字列は二重引用符 "abc" を使います。
例: 拡張子の検索
String fileName = "report.final.version.docx";
int lastDot = fileName.lastIndexOf('.');
String extension = fileName.substring(lastDot + 1);
System.out.println("ファイル拡張子: " + extension); // "docx"
4. メソッド charAt(): インデックスで文字を取得
charAt(index) メソッドは、指定したインデックスの文字を返します。
使用例
例 1: 先頭の文字を確認する
String city = "Minsk";
char first = city.charAt(0); // 'M'
System.out.println("最初の文字: " + first);
例 2: 先頭が大文字かどうかを確認
String word = "Java";
if (Character.isUpperCase(word.charAt(0)))
{
System.out.println("単語は大文字で始まります!");
}
例 3: 文字列のすべての文字を走査する
String text = "Hello";
for (int i = 0; i < text.length(); i++)
{
System.out.println("文字 #" + i + ": " + text.charAt(i));
}
特徴と注意点
- 範囲外のインデックス(たとえば -1 や >= 長さ)は StringIndexOutOfBoundsException を引き起こします。
- 戻り値は char 型であり、文字列ではありません。
5. メソッド toCharArray(): 文字列を文字配列に変換
toCharArray() は文字列を文字配列(char[])に変換する簡単な方法です。文字単位の処理、ソート、検証などに便利です。
使用例:
String text = "Hello";
char[] characters = text.toCharArray();
for (char c : characters)
{
System.out.println(c);
}
// 出力:
// H
// e
// l
// l
// o
なぜ必要か:
- 文字処理: たとえばアナグラム判定など、文字単位のロジックには配列のほうが扱いやすい。
- 互換性: 一部の API は引数として char[] を期待します。
6. メソッド replace(): 部分文字列を置換
replace(CharSequence target, CharSequence replacement) メソッドは、部分文字列 target のすべての出現を replacement に置き換えます。新しい文字列を返し、元の文字列は変化しません。
使用例:
String sentence = "私は Java でプログラミングするのが好きです。";
String newSentence = sentence.replace("Java", "Java 25");
System.out.println(newSentence);
// 出力: 私は Java 25 でプログラミングするのが好きです。
String email = "support@company.com";
String cleanEmail = email.replace("@", "[at]");
System.out.println(cleanEmail);
// 出力: support[at]company.com
特徴と注意点
- すべての出現が置換されます。
- String は不変です: replace() は新しい文字列を返します。
- 複雑な置換規則には正規表現を使う replaceAll() を利用してください。
7. メソッド trim() と strip(): 空白を取り除く
どちらのメソッドも、文字列の先頭と末尾にある「見えない」文字を削除します。
- trim() — 従来のメソッド: スペース、タブ、改行、および一部の制御文字を削除しますが、すべての Unicode 空白を対象とするわけではありません。
- strip() — 新しいメソッド: Unicode 標準におけるあらゆる空白を考慮します。新規プロジェクトではこちらが推奨です。
使用例:
String s1 = " Hello, world! ";
System.out.println(s1.trim());
// 出力: "Hello, world!"
String s2 = " \u2005 Java 11 \u2005 "; // \u2005 — は Unicode の空白
System.out.println("trim(): " + s2.trim());
System.out.println("strip(): " + s2.strip());
// 出力:
// trim(): Java 11
// strip(): Java 11
なぜ必要か:
- ユーザー入力から余計な空白を取り除く。
- 処理前にファイル/ログなどのデータを正規化する。
8. 実践: 課題を解く
課題 1: パスワード長の検証
String password = "qwerty";
if (password.length() < 8)
{
System.out.println("パスワードが短すぎます!");
}
else
{
System.out.println("パスワードは要件を満たしています。");
}
課題 2: 氏名から名を抽出
String fullName = "Ivanov Ivan Ivanovich";
int firstSpace = fullName.indexOf(' ');
String name = fullName.substring(firstSpace + 1, fullName.indexOf(' ', firstSpace + 1));
System.out.println("名: " + name); // "Ivan"
課題 3: 文字列が特定の文字で始まるかを確認
String surname = "Petrov";
if (surname.charAt(0) == 'P')
{
System.out.println("姓は P で始まります");
}
課題 4: email からドメインを取得
String email = "vasya.pupkin@gmail.com";
int at = email.indexOf('@');
String domain = email.substring(at + 1);
System.out.println("ドメイン: " + domain); // "gmail.com"
課題 5: 文字 'a' のすべての出現を探す
String s = "abracadabra";
int pos = s.indexOf('a');
while (pos != -1)
{
System.out.println("文字 'a' は位置: " + pos + " に見つかりました");
pos = s.indexOf('a', pos + 1); // 最後に見つかった位置の次から探す
}
9. String メソッドの使用でよくある誤り
エラー №1: 文字列の範囲外アクセス
インデックスを取り違えて、存在しない文字/部分文字列にアクセスしてしまうことがよくあります。
String s = "Java";
char c = s.charAt(4); // エラー!有効なインデックスは 0..3
String s = "Hello";
String sub = s.substring(3, 10); // エラー!文字列の長さは 5
エラー №2: end を含む/含まないの混同
substring(start, end) は start の文字を含みますが、end の文字は含みません。
エラー №3: 見つからない場合でも indexOf が -1 以外を返すと期待してしまう
特にその結果を後で substring に使う場合、使用前に必ず結果を確認してください。
エラー №4: 空文字列の扱いを誤る
文字列が空("")のときに charAt(0) や substring(0, 1) を呼ぶとエラーになります。先に長さを確認しましょう。
エラー №5: null の文字列の扱い
文字列が null の場合、いずれのメソッド(length()、substring() など)を呼んでも NullPointerException が発生します。処理前に必ず null をチェックしましょう。
GO TO FULL VERSION