1. ==
“==”很简单,单纯判断两个对象的引用是否相同。
如果相同则直接返回true,如果引用不同,则返回false。
“==”运算符还可以和null进行比较。
基本数据类型没有对象这一说法,因此基本数据类型只能和基本数据数据类型进行比较,而不能和对象进行比较。
public class Food {
int id ;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if ( o == null || getClass() != o.getClass()) return false;
Food food = (Food) o;
return id == food.id;
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
Food food = new Food();
System.out.println(food==null); //结果为false
Food food1 = null;
System.out.println(food1==null); //结果为true
Integer i = 10;
System.out.println(i==null); //结果为false
int a = 12;
short b = 12;
System.out.println(a==""); //报错
System.out.println(a==a); //结果为true
System.out.println(a==b); //结果为true
2. equals方法。
父类Object本身有equals方法,如果子类不进行重写的话,也只是简单地调用”==“。
但实际上一般的类如果想要调用equals方法都会进行重写。
比如String类对equals方法进行了重写,首先判断两个对象的引用是否相同,接着判断是否是父子类的关系,最后再判断字符是否相同。大部分的equals方法都是按照这样的思想进行重写的。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
return (anObject instanceof String aString)
&& (!COMPACT_STRINGS || this.coder == aString.coder)
&& StringLatin1.equals(value, aString.value);
}
equals方法一般对null都会进行处理,因此传入null也不会有事。不过传入null的话肯定是false啦。
Food food = new Food();
System.out.println(food.equals(null)); //结果为false
Food food1 = null;
System.out.println(food1.equals(null)); //报错