equals() & ==
- 对于基本类型(如int)在赋值的时候会按照如下逻辑进行复制
int a = 1;
int b = 1;
a = 2;
对于上面的代码
首先编译器会创建a的引用,然后再内存中(根据不同的声明会在方法栈或堆内存中)查找值为1的区域,若存在则将a的指针指向这个地址,若不存在,则开辟一段新的空间存储值1。
同理,第二行创建b的引用,并在对应的内存空间中,寻找值为1的区域,若找到,则指向该位置,此时a与b指向同一块地址。
第三行代码,编译器会从内存空间中寻找值为2的区域,检索后发现不存在,则开辟出新的空间,将值2存入,并将a的指针指向此区域,此时a不再和b指向同一个区域。
- 对于String|Long|Integer|Double等数据类型,JVM在处理的时候会有一些区别。
public static void main(String []args) {
String str1 = new String("test");
String str2 = new String("test");
String str3 = "test";
String str4 = "test";
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
System.out.println(str1 == str3);
System.out.println(str3 == str4);
System.out.println(str3.equals(str4));
}
控制台输出:
false
true
false
true
true
当使用new关键字初始化String类型的时候,将开辟一段新的内存区域(元空间)存储String的实例,代码中str1和str2分别开辟了两段独立的内存空间存储字符串test,当使用==判断相等时,将会比对str1和str2指针是否指向同一个地址,此时显然是不相同的(返回false),当调用equals()方法时,源码比对的是str1和str2指向地址的值是否相等,此时返回的是true。
当时用赋值的方式初始化变量时,逻辑与基础类型一致,故str3==str4返回值为true。
对于其他类型Long|Integer等也是同样的逻辑。
JAVA中的各种数据类型在内存中存储的方式
本文由 momoker 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Jan 20,2022