黑马程序员技术交流社区

标题: Java中, equals 与 == 的渊源 [打印本页]

作者: waterlee    时间: 2015-4-4 18:09
标题: Java中, equals 与 == 的渊源
本帖最后由 waterlee 于 2015-4-4 18:29 编辑

1,千古不变的 "=="
Java中,"=="永远在比较两个对象是否是同一个对象:指向同一块内存就是同一个对象。

2,不确定的equals
讨论equals,要带上”类“
我们看到很多帖子会说:“== 比较的是对象,equals 比较的是内容”,老实说,你按照这个说法写代码大都是正确的,但是你的理解并不深刻。
其实,Java中的 equals 作为一个方法,我们是不能脱离了 类 而单独讨论它的。
那么,说到底, equals 方法来自Object类,源码是这样的:
public boolean equals(Object obj)
{
        return this == obj;
}
从源码中我们看到了equals和==深远的缘分。
Object类中的equals方法与==功能是一模一样的:比较两个对象是否是同一个对象。
只是,作为Object子类的String类为了符合自身的特质,重写了Object类的equals方法,重写后的效果是:如果两个String对象的值相同,那么调用equals方法返回true,否则返回false。
为什么要这样做:
这是很有道理的,面向对象的思维方式其根源就是想模拟现实生活的逻辑,在现实生活中,我们认为属性完全相同的两个对象就应该是同一个对象(比如String类的值)。
如果不是这样,只用==就好了,为什么还要用equals?

下面给出一个例子:
public class Test
{
    public static void main(String[] args)
    {
      String str1 = "hello";
      String str2 = new String("hello");
      String str3 = new String("hello");
      String str4 = str3;//与str3是同一个对象
      System.out.println(str1 == str2);//false,不是同一个对象
      System.out.println(str2 == str3);//false,不是同一个对象
      System.out.println(str3 == str4);//true,是同一个对象
      System.out.println(str1.equals(str2));//true,值(属性)相同
      System.out.println(str2.equals(str3));//true,值(属性)相同
      A a1 = new A();
      A a2 = new A();
      System.out.println(a1 == a2);//false,不是同一个对象
      System.out.println(a1.equals(a2));//false 因为没有重写equals方法,所以直接调用Object的equals方法(等同于==),所以错误(因为不是同一对象)
    }
}
class A
{}

这里涉及到对String类的理解,请看我的另一篇文章:《Java中String类的内存分配http://bbs.itheima.com/thread-183584-1-1.html     

作者: coolzhou9527    时间: 2015-4-4 23:22
受教了。。。
作者: P李勇    时间: 2015-4-5 00:54
mark之,很全




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2