Java的各种比较
使用Java进行比较在Java中,通常使用以下三个进行比较。
==演算子
equalsメソッド
instansof 演算子
关于运算符在Java的世界中,存在着原始类型和引用类型。当创建原始类型的值时,它们会直接写入内存中。其中的原始类型包括int和boolean。在Java中,==用于比较原始类型的值。
int a = 10;
int b = 10;
int c = 20;
System.out.println(a == b); //true
System.out.println(a == c); //false
int a = 10;
int b = 10;
int c = 20;
System.out.println(a == b); //true
System.out.println(a == c); //false
另外,Java 中还有一种称为枚举的列挙类型。枚举类型可以像类一样使用,但不能在其他类中实例化,只能在枚举内部进行一次实例化。也就是说,枚举实例在程序中只保证存在一个。因此,枚举也可以进行==比较。使用==进行枚举比较被推荐,因为它是空安全的,并且当比较的枚举类型不匹配时会在编译时发现错误。
public enum WEEK {
SUNDAY("日曜日"),
MONDAY("月曜日"),
TUESDAY("火曜日"),
WEDNESDAY("水曜日"),
THURSDAY("木曜日"),
FRIDAY("金曜日"),
SATURDAY("土曜日");
private String name; // フィールドの定義
private WEEK(String name) { // コンストラクタの定義
this.name = name;
}
}
Week week = Week.SUNDAY;
System.out.println(week == Week.SUNDAY); //true
System.out.println(week == Week.SATURDAY); //false
关于equals方法
equals方法用于比较引用类型(例如字符串和对象)的情况。为什么在比较字符串和对象时不能使用==呢?答案是如果在比较字符串或对象时使用==,它将判断引用类型变量是否引用相同的实例(即判断它们是否相等)。而使用Java提供的引用类型equals方法时,它将判断引用实例的内容是否相同(即判断它们是否等价)。
List<String> test1 = Arrays.asList("a","b","c");
List<String> test2 = Arrays.asList("a","b","c");
System.out.println(test1 == test2); // false
System.out.println(test1.equals(test2)); // true
List<String> test1 = Arrays.asList("a","b","c");
List<String> test2 = Arrays.asList("a","b","c");
System.out.println(test1 == test2); // false
System.out.println(test1.equals(test2)); // true
使用equals方法需要注意两点。
第一点是它不具备空安全性。如果左边包含了null,将会出现NullPointerException异常。
String a = null;
String b = "test";
System.out.println(a.equals(b)); // NullPointerException
第二个是,Object类中定义的equals方法只进行了对自身对象(this)和传入参数的引用对象进行等值判断。
public boolean equals(Object obj){
return(this == obj);
}
所以,如果我们想要使用我们自行定义的类的对象进行等值判断,就需要重写equals方法。
public class Person{
String name;
// コンストラクタ
public Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
// Personにキャストして、nameの値が同じか調べる
return name.equals(((Person)obj).name);
}
}
Person test1 = new Person("test");
Person test2 = new Person("test");
System.out.println(test1 == test2); // false
System.out.println(test1.equals(test2)); // true
最后是一点小插曲,Lombok提供了@EqualsAndHashCode注解,它可以自动覆盖equals方法,实现等值判断。
@EqualsAndHashCode
public class Person{
String name;
// コンストラクタ
public Person(String name) {
this.name = name;
}
}
Person test1 = new Person("test");
Person test2 = new Person("test");
System.out.println(test1 == test2); // false
System.out.println(test1.equals(test2)); // true