【Stackoverflow好问题】重写(Override)equlas和hashCode方法时应考虑的问题
来源:互联网 发布:手机淘宝旺旺不能聊天 编辑:程序博客网 时间:2024/05/20 17:40
问题
重写(Override)equlas和hashCode方法时应考虑哪些问题?
精华回答
理论上讲(编程语言、数学层面)
equals() 定义了对象的相等关系(自反性、对称性、传递性)(有点抽象,更详细说明,请参考javadoc) 。
另外,它还具有一致性(也就是说,如果一个对象没有修改,那么对象的equals方法,应总是返回相同的值),此外,o.equals(null)应当总是返回false。
hashCode()(javadoc)也必须具备一致性的(也就是说,如果equal的结果没有变,那么hashcode()也应总是返回相同的值)
总的来说,这两个方法的关系:
假如a.equals(b),那么a.hashCode() 应等于b.hashCode()
实践上讲
如果你重写了其中一个方法,那么务必重写另外一个方法
equals()和hashCode()所计算的属性集(set of fields)应当是一样的
如何更快地重写这两个方法呢?
1、使用Apache Commons Lang library中的EqualsBuilder、HashCodeBuilder
public class Person { private String name; private int age; // ... public int hashCode() { return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers // if deriving: appendSuper(super.hashCode()). append(name). append(age). toHashCode(); } public boolean equals(Object obj) { if (!(obj instanceof Person)) return false; if (obj == this) return true; Person rhs = (Person) obj; return new EqualsBuilder(). // if deriving: appendSuper(super.equals(obj)). append(name, rhs.name). append(age, rhs.age). isEquals(); }}
2、如果你是用eclipse,可以在代码编辑区右键,然后选择 Source > Generate hashCode() and equals()
另外请记得
当你使用一些基于Hash的 Collection 、 Map,例如HashSet, LinkedHashSet, HashMap, Hashtable, 、WeakHashMap等。在键值对被放到集合中之后,请确保其key值所对应的hashCode()是保持不变的。比较可靠的一个办法,是保持这些key是不可变的,这也能带来不少好处
stackoverflow链接:
http://stackoverflow.com/questions/27581/what-issues-should-be-considered-when-overriding-equals-and-hashcode-in-java
专栏介绍:
非常喜欢stackoverflow,总能在上面找到疑难杂症的解决办法。偶然发现该网站有一个热度榜单。于是精选了热度较高的一些问题,然后按照自己的理解,把大家的讨论梳理出来。因此,这些文章不是真正的翻译,而是按照自己的理解做了一些增删、润色,希望能把上面的讨论,更精简有效地分享给大家。
如需转载,请注明原文地址
http://blog.csdn.net/lizeyang
1 0
- 【Stackoverflow好问题】重写(Override)equlas和hashCode方法时应考虑的问题
- 重写equlas,hashcode . 和比较类大小
- 重写equlas()方法的规则
- HashMap中 hashcode()方法和equels()方法重写问题
- 【Stackoverflow好问题】StringBuilder和StringBuffer对比
- 库谜题之57名字问题(equals和hashcode)(考虑散列函数的问题)
- 重写BaseAdapter时应注意的问题
- mybatis 重写时应注意的问题
- Integer中equlas()方法的运用与问题总结
- 重写equals方法以及hashcode方法注意的问题
- hashset中equals和hashcode方法重写问题
- HashMap和HashSet中hashCode()和equals()方法重写的问题
- 子类重写父类的方法应注意的问题
- 子类重写父类的方法应注意的问题
- 子类重写父类的方法应注意的问题
- 方法的重写(override)
- hashtable里面关于equals和hashcode的覆盖重写问题
- 系统架构设计应考虑的问题
- SQL Server错误代码大全及解释
- C++中算术运算的隐式转换规则
- iframe父子兄弟之间调用传值(contentWindow && parent)
- ArrayAdapter把选中栏设置为高亮
- 13岁Python开发者写给青少年的Python入门教程
- 【Stackoverflow好问题】重写(Override)equlas和hashCode方法时应考虑的问题
- java io流基础知识
- 关闭myeclipse的Maven自动更新
- linux error:declaration is incompatible with overloaded function "index"
- ubuntu源码编译PHP及卸载PHP
- 关于VS2008中的targetver.h文件
- Linux下软件的安装与卸载(菜鸟学习整理)
- 学习 gcc编译器使用3 生成动态链接
- Intersection of Two Linked Lists