要彻底弄懂equals与==的区别,首先要了解JVM中的内存分配
1、基本数据类型:是存放在栈内存中的
2、引用类型:引用存放在栈中,对象数据存在堆内存中。比如:创建一个学生类:Student stu=new Student();//stu就是引用,new Student()就是调用对象的构造方法在堆中开辟空间,通过栈中的引用来调用对象存在堆中的数据
3、==是比较内存地址,equals()是比较内容是否相等(先这样理解)
从源码上理解:
1、java.lang.Object类(所有类的父类)中的equals方法源码:底层也是用==比较的
通过源码可以看出:Object类的equals方法是比较内存地址的
2、其他类都是继承Object,所以继承的equals方法(没有对equals方法重写时)默认是比较地址的
3、很多类对equals方法进行重写覆盖,如:String、Integer等
String源码:通过源码可以看出,是比较两个字符串的值
总结:
== 的作用:
基本类型:比较的就是值是否相同
引用类型:比较的就是地址值是否相同
equals 的作用:
基本类型:不是类,不能用equals方法比较
引用类型:分两种情况
1、没重写equals方法:比较的是内存地址,我们自己定义的类也是比较内存地址的,如Student
2、重写equals方法:比较的是两个对象的变量值,也就是内容是否相等。如String、Integer
1)在Object中:==和equals没有区别,都是比较地址
2)在String类中(对Object中的equals方法进行了重写):equals比较的是两个对象的内容是否相等