Javaにおける文字列の比較
メニューを表示するにはスワイプしてください
比較は、Javaが予想以上に「低レベル」な動作を始める部分です。文字列も数値と同じように == を使って比較できるのが当然のように感じられます。結局のところ、2つの文字列が見た目で同じなら、等しいはずだと思うのは自然です。
== の問題点
文字列リテラルで == を使うと、最初は正しく動作しているように見えます。
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = "Latte"; String order2 = "Latte"; System.out.println(order1 == order2); } }
両方の変数はJavaの内部の文字列プール内の同じオブジェクトを指しています。同じリテラルが再び現れると、Javaは既存のものを再利用します。そのため、==はtrueを返します。
しかし、次に文字列の生成方法を少し変更してみましょう:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = new String("Latte"); String order2 = new String("Latte"); System.out.println(order1 == order2); } }
new String()を使用すると、Javaは内容が同じであっても毎回完全に別のオブジェクトを作成します。==はメモリアドレスを比較し、テキスト自体ではないため、falseを返します。
重要なルール:==は文字列内部のテキストを見ず、両方の変数がメモリ上のまったく同じオブジェクトを指しているかどうかを確認します。
equals() — 実際の内容の比較
2つの文字列の中身(テキスト)を比較したい場合は、.equals() を使用。メモリ上の位置は無視し、文字だけに注目して比較する方法:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = new String("Latte"); String order2 = new String("Latte"); System.out.println(order1.equals(order2)); } }
order1 と order2 はメモリ上では別々のオブジェクトですが、.equals() は内容を比較し、true を返す。
equals() における大文字・小文字の区別
Javaは大文字・小文字を区別するため、1文字でも大文字・小文字が異なると文字列は等しくなりません。
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = "Latte"; String order2 = "latte"; System.out.println(order1.equals(order2)); } }
"Latte" と "latte" は異なる文字列として扱われるため、結果は false となります。
equalsIgnoreCase() — 大文字と小文字を区別しない比較
大文字・小文字の違いを無視して文字列を比較したい場合は、.equalsIgnoreCase() を使用。
Main.java
12345678910package com.example; public class Main { public static void main(String[] args) { String order = "Latte"; System.out.println(order.equalsIgnoreCase("LATTE")); } }
.equalsIgnoreCase() は "Latte" と "LATTE" を同一とみなし、true を返す。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください