目录
- 一、equals
- 1.前言
- 2.重写equals方法
- 二、==
- 三、equals和==的区别
一、equals
1.前言
**当用equals来比较两个引用数据类型时默认比较的是它们的地址值,比如创建两个成员变量完全相同对象A和对象B两个进行比较,比较的是两个对象的地址值是否相等,而不是比较对象的成员变量,那么如果我想比较两个对象的name属性是否相等该如何去比较呢?答案就是重写对象的equals方法。
**
2.重写equals方法
首先编写一个类:
class testA{
String name;
public testA(){
};
public testA(String name){
this.name = name;
}
public void print(){
System.out.println("testA");
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "testA [name="+name+"]";
}
}
我们先看看不重写equals方法的效果
在主方法中创建两个对象给name属性赋值,比较它们的name是否相等:
public class Demo14_equals {
public static void main(String[] args){
testA t1 = new testA("lisi");
testA t2 = new testA("lisi");
System.out.println(t1.equals(t2));
}
}
效果:
明明两个对象的name都是lisi,为什么比较的时候却输出false勒?因为比较的是两个对象的地址值,而不是name值。
重写equals方法:
class testA{
String name;
public testA(){
};
public testA(String name){
this.name = name;
}
public void print(){
System.out.println("testA");
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "testA [name="+name+"]";
}
public boolean equals(Object o) {
testA t3 = (testA)o;//将传入的o对象强转成testA对象
return this.name.equals(t3.name);//自定义比较它们的name属性,放回结果
}
}
效果:
可以看到比较成功了。
二、==
==的比较规则就是基本数据类型比较值,引用数据类型比较地址
让我们看个示例就明白了:
public class Demo14_equals {
public static void main(String[] args){
testA t1 = new testA("lisi");
testA t2 = new testA("lisi");
System.out.println(t1 == t2);
System.out.println("lisi"=="lisi");
}
}
输出:
很明显可以看到对象比较的是地址,基本数据比较的是值。
比较字符串也可以用下面这个方法:
public class Demo14_equals {
public static void main(String[] args){
System.out.println("lisi".equals("lisi"));
}
}
效果:
三、equals和==的区别
equals方法对于字符串来说是比较内容的,而对于非字符串来说是比较其指向的对象是否相同的。
== 比较符也是比较指向的对象是否相同的也就是对象在对内存中的的首地址。
String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以是true。
希望对各位小伙伴有帮助