A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© waterlee 初级黑马   /  2015-4-4 18:09  /  524 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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     

2 个回复

倒序浏览
受教了。。。
回复 使用道具 举报
mark之,很全
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马