目录
在最前面。首先纠正一个思维误区:equals()方法是比较值的。
equals()方法是比较值的(该说法错误)
一: "=="的使用
1)可以使用在基本数据类型变量和引用数据类型变量中
2)如果比较的是基本数据类型变量:比较的是两个变量保存的数据是否相等。(不一定要类型相同)
如果比较的是引用数据类型变量:比较两个对象的地址值是否相同,即两个引用是否指向同一个实体。
(补充:此时“==”两边的变量类型要一致)
基本数据类型变量比较举例
int i = 10;
int j = 10;
double d = 10.0;
System.out.println(i == d); // true 因为存在类型提升,所以可以进行比较
char ch = 10;
System.out.println(ch == i); // true .
// 注意上面返回的true,因为ch对应的值是10,而不是说'10',不然字符存储类1两位字符呀
char c1 = 'A';
char c2 = 65;
System.out.println(c1== c2); //true
引用数据类型举例
public class Customer {
public String name;
private int age;
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
}
public class equals {
public static void main(String[] args) {
Customer cu1 = new Customer("Tom",11);
Customer cu2 = new Customer("Tom",11);
System.out.println(cu1 == cu2); // false
}
特别注意:String的两种不同定义和初始化方法举例
public class equals {
public static void main(String[] args) {
String s1 = "BB";
String s2 = "BB";
System.out.println(s1 == s2); // TRUE
String s3 = new String("BB");
String s4 = new String("BB");
System.out.println(s3 == s4); //FALSE
}
}
二:qeuals()方法的使用
1)equals()是一个方法,而非运算符
2)equals()方法只能适用于引用数据类型
3)Object类中equals()的定义:
public boolean equals(Object obj){
return (this == obj);
}
【注意】:Object类中equals()还是和“==”一样,比较的还是引用数据类型的地址。
System.out.println(cu1.equals(cu2)); //flase
4)上面(3)中是最原始的Object里面的equals()方法,但是像String, Date , File , 包装类等都重写了Object类中的equals()方法。
重新写之和,比较就不是两个引用的地址是否相同,而是比较两个对象的“实体内容”是否相等,即对应的数值是否相等。
String str1 = new String("ye");
String str2 = new String("ye");
System.out.println(str1.equals(str2));// true
5)通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的“实体内容”(数值)是否相等。
但是我们自定义的类,对应的是Object里面的equals()方法,因此,我们需要对Object类中的equals()进行重写。
重写的原则:比较两个对象的实体内容是否相同。
我们可以手写也可以通过编辑器自动生成,下面是我们手动编写的重写equals()方法。
public class Customer {
public String name;
private int age;
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
@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)){
// int类型的age使用==比较,String类型的name使用equals比较
return true;
}else{
return false;
}
}else{
return false;
}
}
}