浏览 5217 次
锁定老帖子 主题:关于"=="与equals中的误区
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-03-02
经常听到不少人说,在基础面试中,会被问及“关于'=='与equals中的区别” 而不少人都是回答:"关于‘==’是只负责基本数据类型比较,和引用对象地址比较,而equals则是比较两个对象间的内容是否一样"。甚至否写面试题目的答案中也是以此作为答案。
这答案当然不是全部错误,但是有相当一部分是误区, 每个类都是使用Object作为超类的,所有对象(包括数组)也实现这个类方法。 对于Object类的equals方法如下: public boolean equals(Object obj) { return (this == obj); } 即是说关于一个普通类,没有作出覆盖equals方法时,改类的比较"=="与equals操作的结果是相同的。
而为什么再字符串中比较,我们强调要使用equals来比较内容,使用“==”会比较是否为同一对象。 是因为在String中equals方法已经覆盖如下: public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; } 根据字符串中的每一个字符作出比较(字符比较相当于基础数据类型比较)
而对于hashCode()是否要覆盖, 主要是在集合类中使用,例如set中为了保持唯一性,判断一个对象是否相等的时候,除了通过equals的值外,还需要通过判断hashCode是否相等 即: 对象相等,必然hashCode都应该相等 hashCode相等,对象未必相等。
文章若有错误,敬请指正,谢谢。 希望更多人把时间花在生活、陪家人和女朋友身上,而不是敲代码上。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-03-02
很基本的知识点,楼主说得也不错。
|
|
返回顶楼 | |
发表时间:2012-03-02
imp860124 写道 很基本的知识点,楼主说得也不错。
谢谢支持。 最近准备面试,上网下载的面试题练手,发现很多答案都有误。 |
|
返回顶楼 | |
发表时间:2012-03-03
简而言之,本质区别就是:equals可被覆盖,实现任意想要的行为,“==”不可
|
|
返回顶楼 | |
发表时间:2012-03-04
一般来说equals被重写后也要求hashCode方法重写,不然会造成不必要的迷惑。至于面试那个,你说的当然是对的,但是觉得有点钻字眼了。
|
|
返回顶楼 | |
发表时间:2012-03-05
上次面试面试官问我==和equals的区别的时候,我跟他说equals在Object类中是用==比较的,他愣了半天,还说回去查查……
|
|
返回顶楼 | |
发表时间:2012-03-05
Cross_Lee 写道 上次面试面试官问我==和equals的区别的时候,我跟他说equals在Object类中是用==比较的,他愣了半天,还说回去查查……
恩,我也试过遇到这样的情况。估计面试官应该是管理层吧。 |
|
返回顶楼 | |
发表时间:2012-03-06
==是硬件的,equals是软件的,这样说对吧
|
|
返回顶楼 | |