Set集合,HashSet集合

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值,将会导致性能的下降。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容