首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

深入【Java】底层细节知识点(4)equals()和==的区别

深入【Java】底层细节知识点(4)equals()和==的区别

eq
uals()==


他们最大的区别就是一个是方法,一个是关系操作符。
Object类中的equals方法源码:
public boolean equals(Object obj)   {       return this == obj;   }
  • 1
  • 2
  • 3
  • 4
可见它直接比较的对象本身。
String类中的equals方法源码(重写Object中的):
public boolean equals(Object anObject) {    if (this == anObject) {        return true;    }    if (anObject instanceof String) {        String anotherString = (String) anObject;        int n = value.length;        if (n == anotherString.value.length) {            char v1[] = value;            char v2[] = anotherString.value;            int i = 0;            while (n-- != 0) {                if (v1 != v2)                        return false;                i++;            }            return true;        }    }    return false;}上面的equals比较当中,都运用到了“==”,这就说明,equals(不管哪个类中的)是==的扩展。
引用《java编程思想》中的原话:
  关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系
总结:
  • 当==比较基本数据类型的时候,就是比较他们本身的值。
  • 而==比较引用数据类型的时候, 就是比较他们在内存的地址
  • equals用来比较引用数据类型一般都要重写该方法。例如String类就重写了这个方法,
  • 如果没有重写equals就直接比较,就是比较他们的内存地址
  • equals不能用于基本数据类型

    上面的str中存储的并不是“a”,而是它所指向的对象的地址。所以将他赋值给str2,比较他俩时返回的就是true

    上面的Student类并没有重写equals方法,结果位false
返回列表