通过重写类的equals和hashcode方法才能确定一个对象,只写equals不行
在hashset中不允许出现重复对象,元素的位置也是不确定的。在hashset中又是怎样判定元素是否重复的呢?判断两个对象是否相等的规则是:
.1),判断两个对象的hashCode是否相等
如果不相等,认为两个对象也不相等,完毕,如果相等,转入2
.2),判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)
注意:equals为true则hashCode一定相等
hashCode相等但equals()不一定为true
一般来说,只有类的实例对象要被采用哈希算法进行存储和检索时,这个类才需要按要求覆盖hashCode方法,即使程序可能暂时不会用到当前类的hashCode方法,但是为它提供一个hashCode方法也不会有什么不好,没准以后什么时候又用到这个方法了,所以,通常要求hashCode方法和equals方法一并被同时覆盖。
HashSet不允许添加相同的对象,评判的标准是hash值,如果不重写hashCode方法,那么boy1和boy3就被其认定为不同的对象,因为每new一个对象默认hash值肯定是不同的,注意:同一个hash值可以有不同的对象。
class Boy{
String name;
int age;
public Boy(String name,int age){
this.name=name;
this.age=age;}
@override
public boolean equals(Object obj){
Boy boy=(Boy)obj;
return this.age==boy.age&&this.name.equals(boy.name);
}
@override
public String toString(){
return name+age;
}
}
class Test{
public void main(String[] args){
Boy boy1=new Boy(xm,10);
Boy boy2=new Boy(xl,20);
Boy boy3=new Boy(xm,10);
HashSet set=new HashSet();
set.add(boy1);
set.add(boy2);
set.add(boy3);
Iterator iterator=set.iterator();
while(iterator.hasNext){
System.out.println(iterator.hasNext);}
}
网友评论