Tips of JAVA -- Equals

in 六月岚起 with 0 comment

equals() & ==

int a = 1;
int b = 1;
a = 2;

对于上面的代码
首先编译器会创建a的引用,然后再内存中(根据不同的声明会在方法栈或堆内存中)查找值为1的区域,若存在则将a的指针指向这个地址,若不存在,则开辟一段新的空间存储值1。
同理,第二行创建b的引用,并在对应的内存空间中,寻找值为1的区域,若找到,则指向该位置,此时a与b指向同一块地址
第三行代码,编译器会从内存空间中寻找值为2的区域,检索后发现不存在,则开辟出新的空间,将值2存入,并将a的指针指向此区域,此时a不再和b指向同一个区域

    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中的各种数据类型在内存中存储的方式