equals 和 == 的区别

2017-03-18  本文已影响23人  大海孤了岛

引言:在理解equals和==的区别之前,必须先搞懂 栈和堆之间的区别
总的来说:
值类型是存储在内存中的栈中,而引用类型的变量在栈中存储的仅仅是引用类型变量的地址,而引用类型本身是存储在堆中。

equals 和 == 的区别:

  • == 操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。

例子:字符串的比较

public class EqualsTest {
    public static void main(String[] args){
        String s1 = "Test";
        String s2 = "Test";
        
        System.out.println("s1 == s2 : " + (s1 == s2));
        System.out.println("s1.equals(s2): " + s1.equals(s2));
    }
}

输出结果:
s1 == s2 : true
s1.equals(s2): true

接下来,做些改动:将s2通过new的方式来创建

public class EqualsTest {
    public static void main(String[] args){
        String s1 = "Test";
        String s2 = new String("Test");

        System.out.println("s1 == s2 : " + (s1 == s2));
        System.out.println("s1.equals(s2): " + s1.equals(s2));
    }
}

输出结果:
s1 == s2 : false
s1.equals(s2): true

我们发现这时候==操作结果为false了,equals方法依旧不变。

实际上,这是字符串缓冲池所起的作用。当我们在创建s1字符串后,s1便存放在字符串缓存池中。

当然,如果我们希望s2是从缓冲池中拿到对象,可以调用intern()方法实现:

public class EqualsTest {
    public static void main(String[] args){
        String s1 = "Test";
        String s2 = new String("Test").intern();

        System.out.println("s1 == s2 : " + (s1 == s2));
        System.out.println("s1.equals(s2): " + s1.equals(s2));
    }
}

输出结果:
s1 == s2 : true
s1.equals(s2): true

也就是说,通过intern()方法防止了程序创建重复的对象。


总结:

  • == 比较的是两个对象的地址,而equals比较的是两个对象的内容
上一篇下一篇

猜你喜欢

热点阅读