急~~~~~~~如何编写一个高质量的equal方法~~

iris0123456 2010-08-17 11:26:31
如何编写一个高质量的equal方法? 知道的高手说的详细点,关系到小弟的前途命运~~~
...全文
199 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ziibin 2010-08-18
  • 打赏
  • 举报
回复
这个应该是要看具体需求的,Java核心技术第一卷的继承一章里有介绍,挺详细的LZ可以去看看
iris0123456 2010-08-17
  • 打赏
  • 举报
回复
没人啊 ??
xutao_2008_2000 2010-08-17
  • 打赏
  • 举报
回复
能抡会砍的都是专家
SNOOPY369 2010-08-17
  • 打赏
  • 举报
回复
同时提醒一句如果把这个对象作为HashMap、HashTable或者HashSet的Key时,override equals()时一定要override hashcode(),因为hashcode协定中规定,相等的对象一定有相同的散列码。高质量hashcode写法:
1. 把某个非零常数值,比如说1 7,保存在一个叫result的int类型的变量中。
2. 对于对象中每一个关键域f(指equals方法中考虑的每一个域),完成以下步骤:
a. 为该域计算int类型的散列码c:
i. 如果该域是boolean类型,则计算( f ? 0 : 1 )
ii. 如果该域是byte、char、short或者int类型,则计算(int) f。
iii. 如果该域是long类型,则计算(int)(f^(f >>>32))
i v. 如果该域是float类型,则计算Float.floatToIntBits(f)。
v. 如果该域是double类型,则计算Double.doulbeToLongBits(f)得到一个long类型的值,然后按照步骤2.a.iii,对该long型值计算散列值。
vi. 如果该域是一个对象引用,并且该类的equals方法通过递归调用equals的方式来比较这个域,则同样对这个域递归调用hashCode。如果要求一个更为复杂的比较,则为这个域计算一个“规范表示( canonical representation)”,然后针对这个范式表示调用hashCode。如果这个域的值为null ,则返回0(或者其他某个常数,但习惯上使用0)。
vii. 如果该域是一个数组,则把每一个元素当做单独的域来处理。也就是说,递归地应用上述规则,对每个重要的元素计算一个散列码,然后根据步骤2.b中的做法把这些散列值组合起来。
SNOOPY369 2010-08-17
  • 打赏
  • 举报
回复
摘自《Effective Java》
1. Use the == operator to check if the argument is a reference to this object.
If so, return true. This is just a performance optimization, but one that is worth
doing if the comparison is potentially expensive.
使用 == 操作符检查实参是否为指向这个对象的一个引用。如果是的话,则返回true。这只不过是一种性能优化,如果比较操作有可能非常耗时的话,这样做是值得的。
2. Use the instanceof operator to check if the argument has the correct type.
If not, return false. Typically, the correct type is the class in which the method
occurs. Occasionally, it is some interface implemented by this class. Use an interface if the class implements an interface that refines the equals contract to
permit comparisons across classes that implement the interface. Collection interfaces
such as Set, List, Map, and Map.Entry have this property.
使用instanceof操作符检查“实参是否为正确的类型”。如果不是的话,则返回false。通常,这里“正确的类型”是指equals方法所在的那个类。有些情况下,是指该类所实现的某个接口。如果一个类实现的一个接口改进了equals约定,允许在实现了该接口的类之间进行比较,那么使用这个接口作为正确的类型。集合接口(collection interface)Set、List、Map和Map.Entry具有这样的特点。
3. Cast the argument to the correct type. Because this cast was preceded by an
instanceof test, it is guaranteed to succeed.
把实参转换到正确的类型。因为前面已经有了instanceof测试,所以这个转换可以确保成功。
4. For each “significant” field in the class, check if that field of the argument
matches the corresponding field of this object. If all these tests succeed, return
true; otherwise, return false. If the type in step 2 is an interface, you
must access the argument’s fields via interface methods; if the type is a class,
you may be able to access the fields directly, depending on their accessibility.
对于该类中每一个“关键(significant)”域,检查实参中的域与当前对象中对应的域值是否匹配。如果所有的测试都成功,则返回true;否则返回false。如果第2步中的类型是一个接口,那么你必须通过接口的方法,访问实参中的关键域;如果该类型是一个类,那么你也许能够直接访问实参中的关键域,这要取决于它们的可访问性。
猿敲月下码 2010-08-17
  • 打赏
  • 举报
回复
LZ去看下effective Java
scrack 2010-08-17
  • 打赏
  • 举报
回复
看好九楼 哈哈
michaellufhl 2010-08-17
  • 打赏
  • 举报
回复
Eclipse里面'Source'->'Generate hashCode() and equals()'。
Tassdars 2010-08-17
  • 打赏
  • 举报
回复
理论说法(节选自JDK文档):

自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。

实际用法:

见7楼,Eclipse生成的是有模板意义的,规则都差不多。另外,具体情况具体分析,比如两个人,楼主可以只判断身证份相同就行了,人还有体重属性,不同时间的体重不同,就没必要作为判断equals的条件。
iris0123456 2010-08-17
  • 打赏
  • 举报
回复
面试题就这样问的~~~
大家觉得自己会怎样答?
ycnanevol 2010-08-17
  • 打赏
  • 举报
回复
在eclipse中按 ALT + SHIFT + S,在弹出菜单中选 generate equals and hashCode
看~见证奇迹的时刻!
  • 打赏
  • 举报
回复
一个 equals 就能关系到你的命运
hardycheng 2010-08-17
  • 打赏
  • 举报
回复
这样写就行

已知量.equals(可变量) 可以防止出现 空指针异常等。
i李小武 2010-08-17
  • 打赏
  • 举报
回复
LZ能不能吧具体的需求拿出来呢?
wyang1991 2010-08-17
  • 打赏
  • 举报
回复
看你什么需求了。。。。。

复杂的需求,设计模式应该会用到
guestdaocao 2010-08-17
  • 打赏
  • 举报
回复
这个和你需要为哪个对象覆写equals有关哈,不能笼统而谈的。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧