Java基础 Java 中 equals 和 hashCode
2013-11-29 20:57
316 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
Java中有时会碰到要覆盖equals方法的时候,例如判断两个对象是否相等是根据年龄,姓名性别来判断的:
按照常识,我们应该希望persons中只有一个元素,但是实际上有两个,这是因为我们没有覆盖hashCode函数。
Object类中的hashCode函数会生成默认的散列码值,跟我们想要的不一致,我们认为相等的两个Person应该相等但是散列码不同,导致这连个对象不相等,这违背了equals的定义,所以我们要覆盖hashCode方法:
这样,上面的打印结果就是 : 1 了。
总结 : 要保证两个对象在任何时候都相等,则覆盖equals的同时,一定要覆盖hashCode!
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
Java中有时会碰到要覆盖equals方法的时候,例如判断两个对象是否相等是根据年龄,姓名性别来判断的:
calss Person{ public boolean equals(Object obj){ Person p = (Person)obj; return this.age == p.age && this.name == p.name && this.sex == p.sex;
} //setter、 getter private String name; private String sex; private int age; }这样,就可以判断两个对象是否相等了。但是,当往集合中添加Person时,就会出问题了:
class Test{ public static void main(String[] args){ Set<Person> persons = new HashSet<Person>(); Person p1 = new Person(); p1.setName("小强"); p1.setSex("男"); p1.setAge(20); Person p2 = new Person(); p2.setName("小强"); p2.setSex("男"); p2.setAge(20); persons.add(p1); persons.add(p2); System.out.println("persons size : " + persons.size()); } }
按照常识,我们应该希望persons中只有一个元素,但是实际上有两个,这是因为我们没有覆盖hashCode函数。
Object类中的hashCode函数会生成默认的散列码值,跟我们想要的不一致,我们认为相等的两个Person应该相等但是散列码不同,导致这连个对象不相等,这违背了equals的定义,所以我们要覆盖hashCode方法:
class Person{ public int hashCode(){ return this.name.hashCode() + this.sex.hashCode() + age; //这边的效率不高,可以用能标识唯一结果的算法 列如 : age * 46;等 } public boolean equals(Object){ //....... } //setter getter private String name; //...... }
这样,上面的打印结果就是 : 1 了。
总结 : 要保证两个对象在任何时候都相等,则覆盖equals的同时,一定要覆盖hashCode!
相关文章推荐
- 程序猿的日常——Java基础之equals与hashCode
- java基础入门-hashcode与equals方法
- java基础学习总结——Java hashCode() equals()总结
- Java基础: HashSet 与 hashCode、equals
- 【12】Java基础: equals 与 == 的关系,equals 与 hashCode 的关系
- JAVA基础笔记(Java:重写equals()和hashCode())
- 面试题之java基础:equals()和hashCode()区别?
- java基础:equals() 和 hashCode()的一些理解
- java基础之问题:请说出hashCode方法、equals方法、HashSet、HashMap之间的关系
- Java基础之 与equals()如影随行的hashCode()
- java基础----比较对象 hashcode 与 equals 与 ==
- java(15):基础:“==”、equals()和hashCode()的区别
- Java基础复习(一)------equals、==和hashCode
- Java基础重温(七)java中hashcode()和equals(),equals()与==
- 【Java基础之重写equals、hashCode和compareTo方法】什么时候需要重写重写equals方法?为什么重写equals方法,一定要重写HashCode方法?
- 【Java基础之Object类(一)】Java中Object类中的所有方法(toString、equals、hashCode、clone、finalize、wait和notify等)详解
- java基础 equals与==区别,String的hashcode
- Java基础:hashCode与equals个人学习记录
- java基础-hashCode()和equals()的本质区别和联系
- 【Java基础】JAVA中重写equals()方法为什么要重写hashcode()方法?