美文网首页
equals 和 == 的区别

equals 和 == 的区别

作者: 大海孤了岛 | 来源:发表于2017-03-18 19:48 被阅读23次

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

equals 和 == 的区别:

  • == 操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
  • 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时,程序会在缓冲池中寻找到具有相同值的s1,因此s2和s1共同引用对象"Test"。也就是说s1和s2的引用地址相同,那么自然引用对象也是相同的咯。所以两者都为true。
  • 对于第二种情况,我们通过new方式创建了s2,相当于告诉程序“我要个新的,不要旧的”。因此,程序会重新创建一个"Test"对象在内存中,虽然它们的值相同,但它们的位置是不同的。因此,它们的引用地址自然是不同的,==操作自然为false,equals为true,因为它们的内容还是相同的。

当然,如果我们希望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比较的是两个对象的内容
  • 地址相同的两个对象自然内容也是相同的,即满足==为true,则equals必然为true。但注意对象内容相同的,地址不一定相同,因此,满足equals为true,但==不一定为true。

相关文章

  • Java 比较相等

    Java Equals() 特性 Equals() 和 == 的区别 重写Equals方法 重写HashCode方法

  • java 中 String == 原理 equals 和

    == 和equals的区别

  • 【面试1】

    基础 1、equals和==(equals和==的区别)equals:是Object的一个方法,实现对象的比较;复...

  • HashCode和Equals的区别

    HashCode和equals的区别: String方法的equals方法和HashCode方法 String的H...

  • ==和equals

    ==和equals的区别: ==和equals方法都是用来比较两个变量/对象是否相等。 如果没有重写equals方...

  • == 和 equals() 区别

    解释 代码 重写equals方法

  • ==和equals区别

    基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boo...

  • ==和Equals区别

    ==和Equals区别 对于基本数据类型:(byte、short、char、int、float、double、lo...

  • ==和Equals区别

    对于基本数据类型:(byte、short、char、int、float、double、long、boolean),...

  • 微小知识点合集

    1、equals和equalsIgnorecase有什么区别? 在JAVA里面,牵扯到equals和equalsI...

网友评论

      本文标题:equals 和 == 的区别

      本文链接:https://www.haomeiwen.com/subject/jntpnttx.html