HashSet

来源:互联网 发布:淘宝首页轮播代码 编辑:程序博客网 时间:2024/06/06 01:53

1、简介

HashSet是基于HashMap的key实现,元素由hash表支持,不保证元素的顺序。

1.2 继承关系

java.lang.Object    java.util.AbstractCollection<E>        java.util.AbstractSet<E>            java.util.HashSet<E>

1.3 构造函数

//构造一个新的空集合; 背景HashMap实例具有默认初始容量(16)和负载因子(0.75)。HashSet()//构造一个包含指定集合中的元素的新集合。HashSet(Collection<? extends E> c)//构造一个新的空集合; 背景HashMap实例具有指定的初始容量和默认负载因子(0.75)。HashSet(int initialCapacity)//构造一个新的空集合; 背景HashMap实例具有指定的初始容量和指定的负载因子。HashSet(int initialCapacity, float loadFactor)

2、源代码

public class HashSet<E>    extends AbstractSet<E>    implements Set<E>, Cloneable, java.io.Serializable{    //HashSet容器    private transient HashMap<E,Object> map;    //hashmap的value    private static final Object PRESENT = new Object();    //构造中都是在初始化HashMap    public HashSet() {        map = new HashMap<>();    }    public HashSet(Collection<? extends E> c) {        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));        addAll(c);    }    public HashSet(int initialCapacity, float loadFactor) {        map = new HashMap<>(initialCapacity, loadFactor);    }    public HashSet(int initialCapacity) {        map = new HashMap<>(initialCapacity);    }    //迭代器    public Iterator<E> iterator() {        return map.keySet().iterator();    }    //元素个数    public int size() {        return map.size();    }    //添加Set元素,即是将元素赋为HashMap的key    public boolean add(E e) {        return map.put(e, PRESENT)==null;    }    //移除操作    public boolean remove(Object o) {        return map.remove(o)==PRESENT;    }}

2.2 遍历

    public static void main(String[] args) {        HashSet hashSet = new HashSet();        //foreach        for(Object key: hashSet) {        }        //迭代器        Iterator<String> it = hashSet.iterator();        while (it.hasNext()) {            Object key = it.next();        }    }

2.3 总结

HashSet是基于HashMap的key实现,HashSet的元素即是HashMap的key。

static final Object PRESENT = new Object();保证了HashMap的value只有一个实例,尽量减少了内存的占用。

使用组合的方式,简化了代码

如果存储对象,尽量重写hashcode方法,防止对象的内容相同但是对象不同的情况
如:

class A {    String param="123";}public static void main(String[] args) {    System.out.println(new A().hashCode());    System.out.println(new A().hashCode());}

内容相同但是hashCode不同