在了解equals和==的区别之前,我们首先要明确JVM的内存分配
在JVM中,内存分为堆内存跟栈内存。他们二者的区别是: 当我们创建一个对象(new Object)时,就会调用对象的构造函数来开辟空间,将对象数据存储到堆内存中,与此同时在栈内存中生成对应的引用,当我们在后续代码中调用的时候用的都是栈内存中的引用。还需注意的一点,基本数据类型是存储在栈内存中,而包装类型则是引用存在栈内存中,而数据对象存在堆内存中。
然后我们来具体比较一下equals和==
== 是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同
例如:
我们int a= 2 a是一个基本类型,那么引用a存储在栈内存中,占内存中存储的就是数字2,我们如果在定义一个int b=3,那么引用b的栈内存中存储的就是3,所以当用 “==”比较的时候直接比较的是2是否等于3
而当我们Integer a=2,Integer b=3的时候,引用a栈内存中存储的是堆内存的一个地址,数字2在堆内存中存储,所以在我们对包装类型使用 == 的时候,实际上是比较引用a ,b指向的堆内存地址是否相同。