CodeGym /コース /JAVA 25 SELF /文字列の比較: equals, equalsIgnoreCase, compareTo

文字列の比較: equals, equalsIgnoreCase, compareTo

JAVA 25 SELF
レベル 9, レッスン 4
使用可能

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」
equals()
はい
false
equalsIgnoreCase()
いいえ
true

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) を使いましょう。

1
タスク
JAVA 25 SELF, レベル 9, レッスン 4
ロック未解除
大文字と小文字を区別しない文字列の比較
大文字と小文字を区別しない文字列の比較
1
タスク
JAVA 25 SELF, レベル 9, レッスン 4
ロック未解除
文字列の接頭辞と接尾辞の確認
文字列の接頭辞と接尾辞の確認
1
タスク
JAVA 25 SELF, レベル 9, レッスン 4
ロック未解除
文字列の辞書順比較
文字列の辞書順比較
1
タスク
JAVA 25 SELF, レベル 9, レッスン 4
ロック未解除
部分文字列の存在確認とメールアドレスの比較
部分文字列の存在確認とメールアドレスの比較
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION