“==”是运算符
①如果比较的对象是基本数据类型,则比较的是其存储的值是否相等
②如果比较的是引用数据类型,则比较的是所指向对象的地址值是否相等(是否是同一个对象)
int a = 1;
int b = 2;
int i = 10;
int j = 10;
double k = 10.0;
char l = 10;
System.out.println(a == b); //false
System.out.println(i == j); //true
System.out.println(i == k); //true
System.out.println(i == l); //true
Customer customer1 = new Customer("Tom",21);
Customer customer2 = new Customer("Tom",21);
System.out.println(customer1 == customer2); //false
可以发现基本数据类型的变量之间进行比较值,除了布尔值不参与其中,剩下的只要值相等,就为TRUE!使用==比较对象比较的就是两个对象在堆内存中的地址值。
①equals()是Object类中的一个方法,而非运算符
②只能适用于引用数据类型之间的比较
我们看一看Object类中equals()方法的源码:
public boolean equals(Object obj) {
return (this == obj);
}
发现Object类中定义的equals()和==的作用相同
Customer customer1 = new Customer("Tom",21);
Customer customer2 = new Customer("Tom",21);
System.out.println(customer1.equals(customer2));//false
String s1 = new String("123");
String s2 = new String("123");
System.out.println(s1.equals(s2));//true
Date date1 = new Date(32532352345L);
Date date2 = new Date(32532352345L);
System.out.println(date1.equals(date2));//true
我们发现customer1和customer2使用equals进行比较,返回的是FALSE,是因为他们是两个对象,在堆内存中的地址当然不一样,但是像String、Date、File、包装类等等 他们都重写了Object类中的equals()方法,重写以后,比较的不是两个引用地址,而是比较的值,所以后面两个测试的结果都为FALSE。
那出于好奇,来看一下String类中的equals是怎么写的:
其实就是分为三部分:
①首先比较了两个对象的地址,如果地址一样,那就直接返回TRUE了
②然后比较两个对象的类型,如果类型不一样,就直接返回FALSE,如果一样就强转类型
③最后就行进行字符串比较
我们自己也将Customer类中原有的默认equals()方法重写
//重写的原则:比较两个对象的实体内容是否相同
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Customer) {
Customer cust = (Customer) obj;
if (this.age == cust.age && this.name.equals(cust.name)) {
return true;
}
return false;
}
return false;
}
}
重新测试之前的,发现结果为TRUE
System.out.println(customer1.equals(customer2));//false==>true
那在我们实际开发当中,会有很多的实体类,如果说每一个都要重写equals()
方法,那就比较麻烦了,所以我们可以自动生成。
Alt+Insert之后选择**Generate hashCode() and equals()**就可以了。