您好,欢迎来到华拓网。
搜索
您的当前位置:首页正文

对象的唯一性

来源:华拓网

通过重写类的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);}

}