Javaで比較する術は?
業務で比較について勉強することがあったので、記事にまとめておくよ。
javaで比較するときによく使うものとして、
equals()
、==
、Objects.equals
があるのでそれぞれ簡単に解説するよ。
equalsメソッド(String.equals())
equalsメソッドは、Stringクラスの文字列を比較するときに利用されるものだよ。
ただし、nullと比較する場合にヌルポ(NullPointerException)が発生することもあるので、注意が必要だよ。基本的な使い方は以下の通り。
str1.equals(str2);
具体的には、
public class Main {
public static void main(String[] args) {
String str1 = "Qiita";
String str2 = "Qiita";
String str3 = "qiita";
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
}
}
// 実行結果
true
false
ただし、nullとの比較の場合はこんな感じ。
public class Main {
public static void main(String[] args) {
String str1 = "Qiita";
String str2 = null;
System.out.println(str1.equals(str2)); //false
System.out.println(str2.equals(str1)); //ヌルポ発生
System.out.println(str2.equals(str2)); //ヌルポ発生
}
}
まとめると以下のようになるよ。
-
nullでない値.equals(nullでない値)
→比較可能 -
nullでない値.equals(null)
→false -
null.equals(nullでない値)
→ヌルポ -
null.equals(null)
→ヌルポ
== 演算子
==
は変数の値が等しいかを検証する演算子だよ。プリミティブ型は値が等しいか(同値性)を検証し、オブジェクト型では同じインスタンスであるか(同一性)を検証するよ。詳しくは書くとややこしくなるので、今回は簡単にだけ解説するよ。
まずはプリミティブ型の比較だよ。
public class Main {
public static void main(String[] args) {
int num1 = 1;
int num2 = 1;
int num3 = 2;
System.out.println(num1 == num2);
System.out.println(num1 == num3);
}
}
// 実行結果
true
false
次にオブジェクト型の比較だよ。ここはコンスタントプールといったJavaの仕組み等が関係しているので、気になる方は調べてみてね。
public class Main {
public static void main(String[] args) {
String str1 = "Qiita";
String str2 = "Qiita";
String str3 = new String("Qiita");
System.out.println(str1 == str2);
System.out.println(str1 == str3);
}
}
// 実行結果
true
false
Objects.equals()メソッド
Objects.equals()
はString.equals()
とは使い方が違うよ。
String.equals()
はヌルポが発生する可能性があるのに対して、Objects.equals()
の場合はヌルポが発生しないよ。
Objects.equals(str1, str2);
具体的な使い方はこんな感じ。
import java.util.Objects;
public class Main {
public static void main(String[] args) {
String str1 = null;
String str2 = "Qiita";
String str3 = null;
System.out.println(Objects.equals(str1, str2));
System.out.println(Objects.equals(str1, str3));
}
}
// 実行結果
false
true
まとめ
Javaで比較するには、Objects.equals()
を使うとかなり便利。ただし、プリミティブ型の比較の場合は==演算子
を用いた方が可読性や処理速度が上がるため使い分けが必要だよ。