HashSet 注意点

HashSet 通过哈希算法来存取集合中的对象,有很好的存取和查找性能 。 

 

自定义Customer 类型,想通过比较name和age过滤重复的 。

package test.java;

public class Customer {

    String name;
    int age;

    public Customer(String name,int age){    //构造方法没有返回值
        this.name=name;
        this.age=age;
    }
    public boolean equals(Object o){
        if(this==o) return true;
        if(!(o instanceof Customer)){
            return false;
        }
        Customer other= (Customer ) o;  // 记得!!!
        return (this.name.equals( other.name)&&this.age==other.age);

    }

   /* public int hashCode(){
        int result ;
        result=(name==null)?0:name.hashCode();
        result=29*result+age;
        return result;
    }*/
}

 

package test.java;
import java.util.HashSet;
import java.util.Set;

public class test {
    public static void main(String[] args) {
        Customer a=new Customer("Tom",25);
        Customer b=new Customer("Tom",25);
        Set<Customer> set=new HashSet<Customer>();
        set.add(a );
        set.add(b);
        System.out.println(set.size());
    }
}

 

当Customer咩有覆盖hashCode方法时,集合长度是2,覆盖了hasdCode时才是1 。

为了保证HashSet的正常工作,如果Customer覆盖了equals方法,也应该覆盖hashCode方法,并且保证两个相等的Customer对象的哈希码也是一样的。详见《面向对象编程》 P442

posted @ 2015-02-10 09:23  galaxy77  阅读(134)  评论(0编辑  收藏  举报