java中"=="与equals()的区别

  1. 对于"==",是数值比较:

1)如果作用基本数据类型的变量比较,则直接比较其存储的"值"的大小;
2)如果作用于引用类型的变量标胶,则比较的是引用对象的内存地址数值。

  1. 对于equals方法,是内容比较

注意:equals方法不能作用于基本数据类型的变量,equals继承Object类,如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址。

对于基本数据类型,由于大小可知,生存期可知,所以存储在栈上,并且栈有一个重要的特殊性,就是存在栈中的数据可以共享。比如我们定义:
int a = 3; int b = 3;
编译器先处理int a = 3,在栈上创建一个变量a的引用,然后查找有没有字面值为3的地址,如果没有就开辟一块空间用来存储3这个字面值的地址,然后将a指向3的地址,而后处理int b = 3,由于栈中已经有了3这个字面值,所以b就直接指向3的地址,这样a,b就同时指向了3的情况。
对于引用类型,就拿String来举例,存在两种实例化方式,一种是直接赋值,则存放在常量池中,引用对象所存的是常量池中的内存地址数值,另一种是通过构造方法进行实例化,这种会在堆上开辟两块空间,引用对象所存的是对象所在堆内存中的内存地址数值。
在这里插入图片描述
基于上面两种类型的存储方式的不同,equals方法是用来进行对象的比较,而不能用于基本数据类型的比较,我们结合equals方法的源码来进行深入的了解:
在这里插入图片描述
从源码中可以看出,equals继承Object类,首先比较两个内存地址是否相同,如果相同则指向同一个堆内存中的对象,直接返回true,如果不同再判断该对象是否是String类的一个对象,如果不是则返回false,如果是则向下转型,比较两个对象对应的属性是否相等,如果相等返回true,如果不等返回false,在整个比较的过程中,比较的都是是都是同一个对象,以及对象的属性是否相同,并没有比较内存地址数值,所以equals方法比较的是内容。
如果我们需要对equals方法进行修改,我们可以选择重写equals方法。

相关信息可查看:https://www.cnblogs.com/smyhvae/p/3929585.html
相关信息可查看:https://blog.csdn.net/qq_27471405/article/details/81010094

猜你喜欢

转载自blog.csdn.net/weixin_44707979/article/details/89304718
今日推荐