一、什么情况下需要重写equals和hashcode()两个方法?
1、加入到hashset中的自定义类的对象,为确保他们不重复,需要对他们的类重写equals()和hashcode()的方法。
如果不重写equals,相同内容不同引用的对象会被当做不同的对象被加入到hashset中。
重写equals()的示例代码:
public boolean equals(Object obj){//这里不可以写成自定义类型自定义类型引用,这样集 <span style="white-space:pre"> </span> //合框架的底层不会调用这个重载的方法。 <span style="white-space:pre"> </span>if(!(obj instanceof Person)){ <span style="white-space:pre"> </span>return false; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>Personp =(Person)obj; <span style="white-space:pre"> </span>//用来查看equals方法是否被调用 <span style="white-space:pre"> </span>sop(this.name +".......equals......."+ p.name); <span style="white-space:pre"> </span>//认为名字相同并且年龄一样大的两个对象是一个 <span style="white-space:pre"> </span>return this.name.equals(p.name) && this.age == p.age; }
测试结果:
【结论】循环迭代结果:a2::12被打印了两次,说明重复的元素new Person("a2", 12)被添加到集合中去。没有保证HashSet的唯一性。
同时equals没有被调用,说明仅仅重写equals方法没起到作用
二、不是重写equals就够啦吗,为什么这里还要重写hashcode()?
答:hashset在存储对象时,先判断两个对象的hash值是否一样,只有在hashcode()相等的前提下equals()也相等,才认为两个对象时同一个。
重写hashcode的示例代码:
public int hashCode(){ sop(this.name +"......hashCode"); return this.name.hashCode() + 29*age; } |
三、ArrayList的机制又是怎样的?
[1]. HashSet判断、删除和添加元素等操作依据的是被操作元素所在的类的hashCode()和equals( )这两个方法。
[2]. ArrayList做同等的操作,依据的仅仅是equals( )方法
参考:http://blog.csdn.net/benjaminzhang666/article/details/9468487#
学习笔记-JAVA-考点10-什么情况下需要重写equals和hashcode()两个方法?
原文地址:http://blog.csdn.net/wzwdcld/article/details/45193705