1、如果只是非数组【对象】,二者等价。
public class Demo8 {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
System.out.println(Objects.equals(a,b));
System.out.println(Objects.deepEquals(a,b));
Baby baby_1 = new Baby("Baby");
Baby baby_2 = new Baby("Baby");
System.out.println(Objects.equals(baby_1,baby_2));
System.out.println(Objects.deepEquals(baby_1,baby_2));
}
}
运行结果:
2、如果是基本类型的数组,equals在二者物理地址相同(即实际上是同一个数组)的情况下返回true。如果物理地址不同,就算内容一样,也会返回false;而deepEquals只需内容一样就会返回true。
public class Demo9 {
public static void main(String[] args) {
int[] array={
1,2,3};
int[] array_ref=array; //与array其实是同一个数组,二者物理地址相同
int[] array_same_content={
1,2,3}; //与array为两个数组,物理地址不同,但内容相同
System.out.println(array.equals(array_same_content));//Object类
System.out.println(Objects.equals(array,array_same_content));
System.out.println(Objects.deepEquals(array,array_same_content));
System.out.println(array.equals(array_ref));//Object类
System.out.println(Objects.deepEquals(array,array_ref));
}
}
运行结果:
3、如果是对象类型的数组,equals在二者物理地址相同(即实际上是同一个数组)的情况下返回true。如果物理地址不同,就算内容一样,也会返回false;而deepEquals则不会这么苛刻,它会进一步去比较每个元素,又是比较。。。对元素怎么比较呢?也是deepEquals。。。(可能有多层嵌套,所以叫deepEquals嘛)。还是用案例说话吧!
- 数组中的对象成员重写了equals方法(内容相同即相等):
public class Demo10 {
public static void main(String[] args) {
String[] strArray={
"Tom","Mary"}; //String[]数组的成员是String对象,String对象重写了equals方法(内容相同即相等)
String[] strArray_same_content={
"Tom","Mary"};
System.out.println(strArray.equals(strArray_same_content)); //物理地址不同,false
System.out.println(Objects.equals(strArray,strArray_same_content));
System.out.println(Objects.deepEquals(strArray,strArray_same_content)); //内容相同,每个String成员的equals为true,最后返回true
}
}
运行结果:
- 数组中的对象成员没有重写equals方法(即要想每个成员的equals为true,成员的物理地址得相同!)
//案例一
public class Demo11 {
public static void main(String[] args) {
Car[] array=new Car[]{
new Car("奔驰"),new Car("宝马")}; //Car[]中的Car没有重写equals方法,两个Car元素要想equals,物理地址相同才行!
Car[] array_same_content=new Car[]{
new Car("奔驰"),new Car("宝马")};
System.out.println(array.equals(array_same_content));
System.out.println(Objects.deepEquals(array,array_same_content));
}
}
运行结果:
案例二:
public class Demo12 {
public static void main(String[] args) {
Car BMW=new Car("BMW");
Car Benz=new Car("Benz");
Car[] array=new Car[]{
BMW,Benz};
Car[] array_same_address=new Car[]{
BMW,Benz};
System.out.println(array.equals(array_same_address)); //两个数组物理地址不同,false!
System.out.println(Objects.deepEquals(array,array_same_address)); //虽然两个数组的物理地址不同,但每个元素地址都相同,true!
}
}
运行结果:
deepEquals有什么用?
当我们想要比较两个数组内容是否相同时,就用deepEquals!(若为对象数组,且对象没有重写equals方法,则不推荐使用)