“==”符号与equals()的“爱恨情仇”
==操作符和equals()方法
==操作符与equals()方法
-
==:
- 基本类型的比较,只要两值相等即为true。
int a=5; int b=5; System.out.println(a==b);运行结果:
true
引用类型比较引用(是否指向同一个对象):只有指向同一个对象时,==才返回true。
package Demo01; public class Application { public static void main(String[] args) { p1=new Person(); Person p2=new Person(); Person p1=p2; System.out.println(p1=p2); } }运行结果:
true
用“==”进行比较时,符号两边的数据类型必须兼容(可自动转换基本数据类型除外),否则编译出错
-
equals():
所有类都继承了Object,也就获得了equals()方法,还可以重写。
只能比较引用类型,其作用与“==“相同,比较是否指向一个对象。
格式:obj1.equals(obj2)
特例:当用equals()方法进行比较时,对类File、String、Date及包装类(Wrapper class)来说,是比较类型及内容而不是考虑引用的是否是指向同一个对象;
-
对于String,”==“是比较对象的内存地址,equals是比较内容(值)
"=="和equals ()方法的区别
== 运算符:
-
可以使用在基本数据类型变量和引用数据类型变量中。
-
如果比较的是基本数据变量:比较两个变量的数据是否相等。(不一定类型要相同)
如果比较的是引用数据类型变量:比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体。
补充:==符号使用时,必须保证符号两边的变量类型一致
Student student=new Student(); Student student1=new Student(); System.out.println(student==student1);运行结果:false
Person person=new Student("周一",22,123456); Student student=new Student("周一",22,123456); System.out.println(person==student);
运行结果:false
equals()方法:
-
是一个方法,而非运算符
-
只适用于引用数据类型
-
Object类中equals()的定义:
public boolean equals(Object object){ return (this==object) }说明:Object类中定义的equals()和==的作用是相同的,比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体
-
像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用地址是否相同,而是比较两个对象的“实体内容”是否相同。
-
通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的”实体内容“是否相同。那么我就需要对Object类中的equals()方法进行重写
-
重写原则:比较两个对象的实体内容,即(name和age是否相同)
重写equals()方法,对两个对象的实体内容进行比较:
//重写equals()方法 public boolean equals(Object obj) { if (this == obj) { return true; } if(obj instanceof Person){ Person person=(Person)obj;//低转高,需强制类型转换 if(person.age==((Person) obj).age && person.name.equals(((Person) obj).name)){ /* name是String类型,如果用"=="运算符进行比较,只会比较的是地址,而不是属性的内容,所以 用equals()方法进行比较String类型的内容是否相同 */ return true; }else { return false; } } return false; }
==和equals()的区别总结:
- ==既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址
- equals()的话,它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也是==;我们可以看到String等类的equals方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equals()是比较值的错误观点
- 对equals的比较具体要看自定义类里有没有重写Object的equals方法来判断。
- 通常情况下,重写equals方法,会比较类中的相应属性是否相等。

浙公网安备 33010602011771号