相等判断时需注意
- 基本数据类型之间,可使用==, 包装类型之间尽量不要使用==、!=,包装类数值超过-127~128, 引用类型地址不同,在-127~128之间时,翻阅底层源码发现,使用的是缓存的值
- 使用Object.equals()做内容比较时, 把常量 或可不能为空的对象放在前面,未知的对象放在括号内
- Objects.equals(a, b) 比较安全,底层对两个参数都进行了非空判断
- Objects.deepEquals(a, b) 用来对数组 或反序列化成的未知对象 进行深度比较
初始化值的不同
基本数据类型的初始化值为 0
short
int
long
double
boolean = false
包装类型初始化为 null
补充
public class Student {
private String addr;
private String name;
private Integer age;
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Student() {
}
public Student(String addr, String name, Integer age) {
this.addr = addr;
this.name = name;
this.age = age;
}
}
public class TestEqualAndHashCode extends Student{
public static void main(String[] args) {
Student stu1 = new Student("1楼", "test", 18);
Student stu2 = new Student("1楼", "test", 18);
System.out.println(">>>>>>>>>>>>>>equals>>>" + stu1.equals(stu1));
System.out.println(">>>>>>>>>>>>>>equals>>>" + stu2.equals(stu2));
System.out.println(">>>>>>>>>>>>>>stu1 hashcode>>> " + stu1.hashCode());
System.out.println(">>>>>>>>>>>>>>stu2 hashcode>>> " + stu2.hashCode());
System.out.println(stu1 == stu2);
System.out.println("stu1 内存地址>>>>" + stu1);
System.out.println("stu2 内存地址>>>>" + stu2);
Map stus = new HashMap<>();
stus.put(stu1, stu1);
stus.put(stu2, stu2);
System.out.println(stus);
System.out.println("student 类信息" + stu1.getClass());
Integer[] integers = {1, 2, 3};
System.out.println("数组 " + integers.toString());
System.out.println("数组 plus" + Arrays.toString(integers));
Arrays.deepToString(integers);
String[] strs = new String[2];
String[] strArray = {"1", "2"};
String[] strArray1 = {"1", "2"};
System.out.println("比较数组" + Objects.equals(strArray, strArray1));
System.out.println("深度比较数组" + Objects.deepEquals(strArray, strArray1));
System.out.println("比较对象" + Objects.equals(stu1, stu2));
Student[] student1 = {new Student("1楼", "test", 18), new Student("1楼", "test", 18)};
Student[] student2 = {new Student("1楼", "test", 18), new Student("1楼", "test", 18)};
System.out.println("对象数组比较" + Objects.equals(student1, student2));
System.out.println("对象数组深度比较" + Objects.deepEquals(student1, student2));
}
}
运行结果
>>>>>>>>>>>>>>equals>>>true
>>>>>>>>>>>>>>equals>>>true
>>>>>>>>>>>>>>stu1 hashcode>>> 231685785
>>>>>>>>>>>>>>stu2 hashcode>>> 114935352
false
stu1 内存地址>>>>com.qif.asuav.uav.Student@dcf3e99
stu2 内存地址>>>>com.qif.asuav.uav.Student@6d9c638
{com.qif.asuav.uav.Student@6d9c638=com.qif.asuav.uav.Student@6d9c638, com.qif.asuav.uav.Student@dcf3e99=com.qif.asuav.uav.Student@dcf3e99}
student 类信息class com.qif.asuav.uav.Student
数组 [Ljava.lang.Integer;@7dc5e7b4
数组 plus[1, 2, 3]
比较数组false
深度比较数组true
比较对象false
对象数组比较false
对象数组深度比较false
小结
1.数组的打印toString 是一个对象信息,因为数组没有重写Obeject 类的 toString 方法
· 2.相同内容的基础类型的数组Objects.equals 方法比较 放回的是false,数组没有重写Object equals 方法,这样用的还是 Object 的equals 方法 还是用 == 进行比较
3.相同内容的基本类型的数组调用Objects.deepEquals 方法返回的是true 比较的是基本类型的内容
4.相同内容的对象类型的数组 如果对象没有重写 equals 方法时候 Objects.equals Objects.deepEquals 返回的都是false。 原因可以阅读源码。Objects.deepEquals 先第一层比较 最后比较到对象里面是调用的是equals 方法,因为没有重写Object 的 equals 的 方法,调用的还是 == 的比较所以返回的还是false。
public class Student {
private String addr;
private String name;
private Integer age;
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Student() {
}
public Student(String addr, String name, Integer age) {
this.addr = addr;
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Student student = (Student) o;
return Objects.equals(addr, student.addr) && Objects.equals(name, student.name) && Objects.equals(age, student.age);
}
}
public class TestEqualAndHashCode extends Student{
public static void main(String[] args) {
Student stu1 = new Student("1楼", "test", 18);
Student stu2 = new Student("1楼", "test", 18);
System.out.println(">>>>>>>>>>>>>>equals>>>" + stu1.equals(stu1));
System.out.println(">>>>>>>>>>>>>>equals>>>" + stu2.equals(stu2));
System.out.println(">>>>>>>>>>>>>>stu1 hashcode>>> " + stu1.hashCode());
System.out.println(">>>>>>>>>>>>>>stu2 hashcode>>> " + stu2.hashCode());
System.out.println(stu1 == stu2);
System.out.println("stu1 内存地址>>>>" + stu1);
System.out.println("stu2 内存地址>>>>" + stu2);
Map stus = new HashMap<>();
stus.put(stu1, stu1);
stus.put(stu2, stu2);
System.out.println(stus);
System.out.println("student 类信息" + stu1.getClass());
Integer[] integers = {1, 2, 3};
System.out.println("数组 " + integers.toString());
System.out.println("数组 plus" + Arrays.toString(integers));
Arrays.deepToString(integers);
String[] strs = new String[2];
String[] strArray = {"1", "2"};
String[] strArray1 = {"1", "2"};
System.out.println("比较数组" + Objects.equals(strArray, strArray1));
System.out.println("深度比较数组" + Objects.deepEquals(strArray, strArray1));
System.out.println("比较对象" + Objects.equals(stu1, stu2));
Student[] student1 = {new Student("1楼", "test", 18), new Student("1楼", "test", 18)};
Student[] student2 = {new Student("1楼", "test", 18), new Student("1楼", "test", 18)};
System.out.println("对象数组比较" + Objects.equals(student1, student2));
System.out.println("对象数组深度比较" + Objects.deepEquals(student1, student2));
}
}
运行结果
>>>>>>>>>>>>>>equals>>>true
>>>>>>>>>>>>>>equals>>>true
>>>>>>>>>>>>>>stu1 hashcode>>> 231685785
>>>>>>>>>>>>>>stu2 hashcode>>> 114935352
false
stu1 内存地址>>>>com.qif.asuav.uav.Student@dcf3e99
stu2 内存地址>>>>com.qif.asuav.uav.Student@6d9c638
{com.qif.asuav.uav.Student@6d9c638=com.qif.asuav.uav.Student@6d9c638, com.qif.asuav.uav.Student@dcf3e99=com.qif.asuav.uav.Student@dcf3e99}
student 类信息class com.qif.asuav.uav.Student
数组 [Ljava.lang.Integer;@7dc5e7b4
数组 plus[1, 2, 3]
比较数组false
深度比较数组true
比较对象true
对象数组比较false
对象数组深度比较true
小结
student 类 重写了 equals 方法 深度比较返回的是true。
总结
对象的深度比较要重写 equasl 方法。
参考资料