一、回顾 == 的使用
==运算符,可以使用在基本数据类型变量和引用类型变量中
1.如果比较的基本数据类型变量:比较两个变量保存的数据是否相等(不一定类型相同)
2.如果比较的是引用类型变量:比较的是两个对象的地址值是否相同,即两个引用是否指向同一个对象实体
二、回顾equals()方法 的使用:
- 是一个方法,而非运算符
- 只能适用于引用数据类型
- Objec类中equals()的定义:
public boolean equals(Object obj){
return (this == obj);
}
说明:Object类中定义的equals()和==的作用是相同的:比较的是两个对象的地址值是否相同,即两个引用是否指向同一个对象实体
4.像String、Date、File、包装类等都重写了Object类中的equals()方法。重写之后,比较的不是两个引用的地址是否相同,而是比较两个对象的“实体内容”是否相同
三、代码解读
public class Customer{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Customer() {
super();
}
public Customer(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
public class EqualTest{
public static void main(String[] args){
/*
*测试基本数据类型变量
*/
int i = 10;
int j = 10;
double d = 10.0;
System.out.println(i == j); //true
System.out.println(i == d); //true,原因==》自动类型提升
boolean b = true;
//System.out.println(i == b); 编译报错,布尔型不参与运算
char c = 10;
System.out.println(i == c);//true,原因==》‘==’比较i和c的数值是否相等
char c1 = 'A';
char c2 = 65;
System.out.println(c1 == c2); //true, 原因==》‘A’的ASCII码为65
/*
*测试引用类型变量
*/
Customer cust1 = new Customer("Tom",21);
Customer cust2 = new Customer("Tom",21);
System.out.println(cust1 == cust2); //false,原因==》cust1与cust2分别指向两个不同实体,即二者的地址不同
//Object类中定义的equal()和==的作用是相同的:
//比较的是两个对象的地址值是否相同,即两个引用是否指向同一个对象实体
System.out.println(cust1.equals(cust2)); //false ,原因==》Customer默认继承Object类
//String、Date、File、包装类**等都**重写了Object类中的equal()方法
String str1 = new String("wujun");
String str2 = new String("wujun");
System.out.println(str1.equals(str2)); //true,原因==》String类中重写了Object类中的equals()方法,比较对象的实体内容是否相等
}
}
四、 重写自定义类中的equal()方法
在实际开发中,我们自定义类对象调用equal()方法通常用来比较两对象实体内容是否相等,那么久需要重写自定义类中的equal()方法
public class Customer{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Customer() {
super();
}
public Customer(String name, int age) {
super();
this.name = name;
this.age = age;
}
//自动生成的equals()
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Customer other = (Customer) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
//重写的原则:比较两个对象的实体内容(即:name和age)是否相同
//手动实现equals()的重写
// @Override
// public boolean equals(Object obj) {
//
System.out.println("Customer equals()....");
// 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;
}else{
return false;
}
//
// //或
// return this.age == cust.age && this.name.equals(cust.name);
// }else{
// return false;
//
// }
//
// }
}
public class EqualTest{
public static void main(String[] args){
Customer cust1 = new Customer("Tom",21);
Customer cust2 = new Customer("Tom",21);
System.out.println(cust1.equals(cust2)); //true,Customer类中重写了Object类中的equals()方法,比较对象的实体内容是否相等
}
}
五、==和equal()的区别总结
- ==既可以比较基本数据类型也可以比较引用类型。对于基本数据类型就是比较值,对于引用数据类型就是比较内存地址
- equals的话,它属于java.lang.Object类里面的方法,如果该方法没有重写过默认也是==(针对引用类型);我们可以看到String、Date等类的equals方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equals是比较值的错误观点。
- 具体要看自定义类里有没有重写Object的equals方法来判断
- 通常情况下,要重写equals方法,会比较类中的相应属性是否相等