1. 参照と内容の比較
Java の文字列はプリミティブではなくオブジェクトです。変数 a と b は、文字列プール内の同じ文字列を指すことがあります。一方、コンストラクタで作られた c は別オブジェクトです。演算子 == はテキストではなく参照を比較します。
String a = "hello";
String b = "hello";
String c = new String("hello");
System.out.println(a == b); // true(おそらくインターン化された文字列)
System.out.println(a == c); // false(異なるオブジェクト)
エラーのデモ
String s1 = "Java";
String s2 = new String("Java");
System.out.println(s1 == s2); // false
見た目は同じ文字列でも、メモリ上では別のオブジェクトです。
2. equals(): 文字列の内容の比較
内容を比較したい場合は equals() を使います。これは文字ごと(大文字小文字を区別)に比較します。
String s1 = "Java";
String s2 = new String("Java");
System.out.println(s1.equals(s2)); // true
例: パスワードの比較
String inputPassword = "Secret123";
String realPassword = "Secret123";
if (inputPassword.equals(realPassword))
{
System.out.println("アクセスが許可されました!");
}
else
{
System.out.println("パスワードが正しくありません。");
}
重要!
どちらか一方でも null の場合、equals() の呼び出しは NullPointerException になります。安全なパターン:
if ("何か".equals(someString)) { ... }
3. equalsIgnoreCase(): 大文字小文字を無視した比較
ユーザー入力などで大文字小文字を無視したい場合は equalsIgnoreCase() を使います。
String name1 = "Ivan";
String name2 = "ivan";
System.out.println(name1.equalsIgnoreCase(name2)); // true
例: email アドレスの比較
String email1 = "User@Example.com";
String email2 = "user@example.com";
if (email1.equalsIgnoreCase(email2))
{
System.out.println("メールアドレスが一致しています!");
}
まとめ: equals と equalsIgnoreCase
| メソッド | 大文字小文字を区別するか? | 例「Java」対「java」 |
|---|---|---|
|
はい | |
|
いいえ | |
4. compareTo(): 文字列の辞書順比較
compareTo() は辞書順(レキシコグラフィック)で比較を行います。最初の文字列が「小さい」場合は負、0 は等しい、より「大きい」場合は正の数を返します。
System.out.println("apple".compareTo("banana")); // < 0
System.out.println("apple".compareTo("apple")); // 0
System.out.println("banana".compareTo("apple")); // > 0
a.compareTo(b) →
< 0 — esli a idyot ran’she b
0 — esli ravny
> 0 — esli a idyot posle b
compareTo() の結果
どのように動作しますか?
- 比較は文字の Unicode コードポイントに基づき左から右へ行われます。
- 最初に差が出た位置で、その文字コードの差が返されます。
- 一方が他方の接頭辞(プレフィックス)の場合、短い方が「小さい」となります。
System.out.println("cat".compareTo("catalog")); // < 0 ("cat" の方が短い)
System.out.println("catalog".compareTo("cat")); // > 0
例: 文字列配列のソート
String[] fruits = {"banana", "apple", "pear"};
Arrays.sort(fruits); // 内部では compareTo() が使われます
System.out.println(Arrays.toString(fruits)); // [apple, banana, pear]
compareToIgnoreCase()
System.out.println("Java".compareToIgnoreCase("java")); // 0
5. メソッド startsWith() と endsWith()
startsWith() と endsWith() は文字列の先頭と末尾を確認し、true/false を返します。
String fileName = "document.pdf";
String url = "https://www.google.com";
System.out.println(fileName.startsWith("doc")); // true
System.out.println(fileName.endsWith(".txt")); // false
System.out.println(url.startsWith("https://")); // true
用途: 形式(ファイル名、URL)の検証やプレフィックス/サフィックスによるフィルタリング(例えば拡張子が ".jpg" のすべて)。
6. メソッド contains(): 部分文字列の検索
contains(CharSequence s) は、部分文字列が含まれるかを簡単に確認するメソッドです。大文字小文字は区別されます。
String text = "Java の世界へようこそ!";
System.out.println(text.contains("世界")); // true
System.out.println(text.contains("C++")); // false
大文字小文字を無視するには、両方を同じ大文字小文字に揃えます: toLowerCase()/toUpperCase()。
7. メソッド toLowerCase() と toUpperCase()
新しい文字列を返し、すべてを小文字または大文字に変換します。大文字小文字を無視した比較や整形に便利です。
String title = "Java Programming";
String lower = title.toLowerCase();
String upper = title.toUpperCase();
System.out.println(lower); // java programming
System.out.println(upper); // JAVA PROGRAMMING
8. メソッド split(): 文字列を分割する
split(String regex) は区切り(正規表現)で文字列を分割し、String[] を返します。
例 1: カンマで分割
String names = "Alex,Maria,Ivan,Elena";
String[] nameArray = names.split(",");
for (String name : nameArray)
{
System.out.println(name.trim()); // trim() は余分な空白を取り除く
}
// 出力:
// Alex
// Maria
// Ivan
// Elena
例 2: スペースで分割
String sentence = "私は Java を学んでいます";
String[] words = sentence.split(" ");
for (String word : words)
{
System.out.println(word);
}
// 出力:
// 私は
// Java
// を学んでいます
注意点:
- 区切りは正規表現です。特殊文字はエスケープが必要です(例えばドットは "\\.")。
- たとえ要素が 1 つでも、常に配列を返します。
9. 実践: 実アプリで文字列を比較する
String registeredEmail = "user@example.com";
String registeredPassword = "Secret123";
Scanner console = new Scanner(System.in);
System.out.print("メールアドレスを入力してください: ");
String email = console.nextLine();
System.out.print("パスワードを入力してください: ");
String password = console.nextLine();
// email は大文字小文字を無視し、パスワードは区別して比較
if (email.equalsIgnoreCase(registeredEmail) && password.equals(registeredPassword))
{
System.out.println("ようこそ!");
}
else
{
System.out.println("メールアドレスまたはパスワードが正しくありません。");
}
コメント: メールには equalsIgnoreCase()、パスワードには厳密に equals() を使います。文字列に対して == を使ってはいけません — これは参照を比較するためです。
10. 文字列比較でのよくある間違い
間違い 1: == で比較し、equals() を使わない
== は内容ではなく参照を比較するため、結果が予想外になることがあります。
間違い 2: equals() を null の可能性があるオブジェクトで呼ぶ
確実に null でないオブジェクトで呼ぶか、Objects.equals(a, b) を使いましょう。
間違い 3: 大文字小文字を無視すべきでない場面で無視する
例えばパスワードは大文字小文字を区別して比較すべきです。要件を確認しましょう。
間違い 4: 文字列と他の型のオブジェクトを比較する
"123" と 123 は同じではありません。equals() は型変換を自動では行いません。
間違い 5: 大文字小文字が混在する文字列のソート
大文字は小文字より先に並びます。大文字小文字を無視してソートするには、Arrays.sort(array, String.CASE_INSENSITIVE_ORDER) を使いましょう。
GO TO FULL VERSION