==和euqals()的区别
1、==运算符
1)可以使用在基本数据类型变量和引用数据类型变量中。
如果比较的基本数据类型变量,比较的是两个变量保存的数据是否相等(不一定类型相同)
2)如果比较的是引用数据类型变量,比较的是对象的地址值是否相同,即,两个引用是否指向同一个对象实体。
2、equals()方法使用
1)equals()是一个方法,不是运算符
2)只能适用于引用数据类型
3)Object类中equals()的定义,equals()方法和==是相同的
public boolean equals(Object obj){
return (this == obj);
}
4)String、Date、File、包装类等都重写了Object类中的equals()方法,重写后,比较的不是两个引用的地址是否相同,而是比较两个对象的“实体内容”是否相同。
5)通常使用equals(),通常是为了比较两个对象的“实体内内容”是否相同,需要对Object类中的equals()进行重写。
equals()重写的原则:
1、对称性,即x.equals(y)的结果与y.equls(x)一致
2、自反性,即x.equals(x)必须为true
3、传递性,即x.equals(y)为tue,y.equals(z)为true,则x.equals(z)也一定是true
4、一致性,无论重复执行多少次,结果都一样
代码示例:
Customer类
public class Customer {
private String name;
private int age;
public Customer(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Customer() {
super();
}
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;
}
//比较两个对象的实体内容是否相同
@Override
public boolean equals(Object obj) {
System.out.println("override 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);
}
return super.equals(obj);
}
}
EqualsTest类
public class EqualsTest {
public static void main(String[] args) {
inti=10;
intj=10;
double d = 10.0;
System.out.println(i == j);//true
System.out.println(i == d);//true
charc=10;
System.out.println(i == c);//true
charc1='A';
charc2=65;
System.out.println(c1 == c2);//true
Customer customer = new Customer("Tom", 21);
Customer customer2 = new Customer("Tom", 21);
System.out.println(customer == customer2);//false
System.out.println("***********");
System.out.println(customer.equals(customer2));//true--重写后的为true;重写前仍为false
System.out.println("***********");
System.out.println(customer.getName().equals(customer2.getName()));//true
}
}