美文网首页30岁程序员的未来心路
Java基础-==和equals的区别?

Java基础-==和equals的区别?

作者: 夜暗殇 | 来源:发表于2021-08-26 09:49 被阅读0次

    首先equals和“==”的第一个区别就是,equals是方法,而“==”是运算符。在了解两者的具体区别时,我们首先要对JVM的内存分配有一定的了解:

    JVM分为堆内存和栈内存,当我们创建一个对象(new Object)时,就会用它的构造函数来开辟空间,将对象数据存储在堆内存中,同时在栈内存中生成相应的引用。在我们的程序调用的时候都是调用的栈内存中的引用,还有一点就是基本数据类型都储存在栈内存中。下面就通过具体的例子来进一步的比较两者的区别:

    首先我们new两个对象

    Student student1 = new Student();

    Student student2 = new Student();

    System.out.println(student1.equals(student2));

    System.out.println(student1 == student2);

    在开发工具中运行的结果是两个输出的都是false。具体原因就是在这种情况下,两者比较的都是对象的物理地址,即对象在栈内存中的引用,这样的话结果理所当然的就是false了。

    而下面这种情况:

    String a = new String("a");

    String b = new String("a");

    System.out.println(a == b);

    System.out.println(a.equals(b));

    输出的结果是false和true。为什么和上面的比较结果不同呢?原因就是这次equlas不仅比较了两个对象的物理地址,还比较了两个对象的具体值。在Java中String中的equals方法被重写了,当两个对象的物理地址不同时,String会进一步的比较两个对象的具体的值。

    但是如果是这样System.out.println(student1.toString().equals(student2.toString()));时,结果就变成了false。这里就牵扯到了hash code的问题,因为只是重写了equals方法并不能让两个对象的hash code进行改变,在Java中首先比较的就是两个对象的hash code值是否相等。因此在比较两个对象是否相等的时候要记得重写equals和hash code方法

    相关文章

      网友评论

        本文标题:Java基础-==和equals的区别?

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