Set集合,HashSet集合

2017-04-12  本文已影响20人  李霖神谷

Set判断两对象是否相同,不是使用==运算符,而是根据equals方法,只要方法返回值为true,Set就不会接收这两个对象。
HashSet是Set接口的典型实现,大多数使用Set集合时就使用这个实现类。
其具有以下几个特点:
不能保证元素的排列顺序,顺序有可能发生变化。
HashSet不是同步的,假设多个线程同时修改HashSet集合时,则必须通过代码来实现。
集合元素可以为null。
当向HashSet集合存入一个集合时,HashSet会调用该对像的hashCode方法来得到该对像的hashCode值,根据该值来确定该对像在HashSet中储存的位置,HashSet判断两个对象相等必须通过equals方法相等,并且两个对象返回的hashCode的值相等。

import java.util.HashSet;

class A{
    public boolean equals(Object obj){
        return true;
    }
}
class B{
    public int hashCode(){
        return 8;
    }
}
class C{
    public boolean equals(Object obj){
        return true;
    }
    public int hashCode(){
        return 2;
    }
}
public class JiHeDemo{
    public static void main(String[] args) {
        HashSet h=new HashSet();
        h.add(new A());
        h.add(new A());
        h.add(new B());
        h.add(new B());
        h.add(new C());
        h.add(new C());
        System.out.println(h);
    }
}

如果两对象的hashCode方法返回的hashCode值相同,但是通过equals方法比较返回的是false将会比较麻烦,因为两对象HashCode值相同,所以HashSet试图将他们保存在同一位置,但是又不行(否则将只剩下一个对象),而hashSet访问集合元素时,也是根据元素的hashCode值来快速定位的。如果HashSet两个以上的元素具有相同的hashCode值,将会导致性能的下降。

上一篇下一篇

猜你喜欢

热点阅读