写在前面
- 最初接触java的时候,都会有涉及
equals
和==
的区别,最经典的案例就是用String类型的数据作类比。最常见的说法就是:equals
比较的是值,==
比较的是引用地址。 - 首先这种说法是错误的,也有人认为这种说法是不完全正确的(至少对于
String
这个类来说这种说法是没问题的)。 - 之所以说这种说法是错误的,是因为本人真的觉得这个总结实在是误人子弟。
1、equals
和==
1.1、==
首先我们要先清楚java中有哪些数据类型,及他们的存储位置。
- java中的数据类型:
- (1)基本数据类型:整数类型(byte,short,int,long)、浮点类型(float,double)、字符型(char)、布尔型(Boolean)
- (2)引用数据类型:类(class)、接口(interface)、数组
- 存储位置:
- 基础数据类型:存储在常量池中(JDK8之后去除了元方法区,改为存在堆内存中的元空间)
- 引用数据类型:存储于堆中。
在java中,==
比较的内容也跟数据所处的位置相关:
- (1)基础数据类型:比较的是值。
- (2)引用数据类型:比较的是是对象的引用地址。
为什么会这样分?我们就需要来看一个例子。
- 示例代码:
public class StringTest { String str1 = "字符串"; String str2 = "字符串"; }
public class StringTest1 { String str3 = new String("字符串"); String str4 = new String("字符串"); }
首先来看一上述两段代码有什么不同?一个是直接赋值,一个是给对象赋值。我们通过javac把上述两段代码编译为.class文件,再用javap方法来反编译看一下:
StringTest
对应的反编译文件public StringTest(); descriptor: ()V flags: ACC_PUBLIC Code: stack=2,