HashSet源码

来源:互联网 发布:如何用手机淘宝买东西 编辑:程序博客网 时间:2024/06/04 01:26

1.HashSet中的元素不能重复,没有顺序

疑问无序 (存储的元素顺序和提取顺序不同)

疑问唯一(存储的元素不能是相同的)


2.源码

package java.util;/** * 无序 (存储的元素顺序和提取顺序不同) * 唯一(存储的元素不能是相同的) * */public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable {    static final long serialVersionUID = -5024744406713321676L;    private transient HashMap<E,Object> map;    // Dummy(虚拟) value to associate(关联) with an Object in the backing Map     private static final Object PRESENT = new Object();    /**     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has     * default initial capacity (16) and load factor (0.75). * 初始容量:16 * 初始加载因子:0.75     */    public HashSet() {map = new HashMap<E,Object>();    }/**     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has     * the specified initial capacity and default load factor (0.75).     * @param      initialCapacity    指定的初始容量,小于0抛异常     */    public HashSet(int initialCapacity) {map = new HashMap<E,Object>(initialCapacity);    }/**     * @param initialCapacity  指定的初始容量,小于0抛异常     * @param      loadFactor  指定的加载因子,小于0或非数字抛异常     */    public HashSet(int initialCapacity, float loadFactor) {map = new HashMap<E,Object>(initialCapacity, loadFactor);    }/**     * 仅由LinkedHashSet使用     * HashMap实例map是具有指定初始容量和指定负载因子的LinkedHashMap。     *     * @param  initialCapacity   指定的初始容量,小于0抛异常     * @param  loadFactor        指定的加载因子,小于0或非数字抛异常     * @param  dummy             忽视,主要是为了区分构造方法HashSet(int initialCapacity, float loadFactor)     */    HashSet(int initialCapacity, float loadFactor, boolean dummy) {map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);    }    /** * 初始容量:足以容纳元素的初始容量     * 加载因子:默认值:0.75     * @param c 一个集合对象,其元素将被放入HashSet中     */    public HashSet(Collection<? extends E> c) {map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));addAll(c);    }// 返回keySet的迭代器    public Iterator<E> iterator() {return map.keySet().iterator();    }// 返回Entry个数    public int size() {return map.size();    }// 没有Entry    public boolean isEmpty() {return map.isEmpty();    }// 通过对象o的key值判断对象o是否在set中    public boolean contains(Object o) {return map.containsKey(o);    }    /**     * 1.如果此set中尚未包含指定元素e,则添加指定元素e并返回true     * 2.如果此set没有包含满足(e==null ? e2==null : e.equals(e2)) 的e2时,则将e2添加到Set中,否则不添加且返回false * 3.如果此set已经包含该元素,则该集合保持不变并返回false     * @param e 元素     */    public boolean add(E e) {return map.put(e, PRESENT)==null;    }    // @param o 如果指定对象o存在于此 set 中,则将其移除    public boolean remove(Object o) {return map.remove(o)==PRESENT;    }    // 从此 set 中移除所有元素.    public void clear() {map.clear();    }    // clone返回此 HashSet 实例的浅表副本:并没有复制这些元素本身    public Object clone() {try {HashSet<E> newSet = (HashSet<E>) super.clone();newSet.map = (HashMap<E, Object>) map.clone();return newSet;} catch (CloneNotSupportedException e) {throw new InternalError();}    }// 序列化    private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException {// Write out any hidden serialization magics.defaultWriteObject();// Write out HashMap capacity and load factor 输出容量和加载因子s.writeInt(map.capacity());s.writeFloat(map.loadFactor());// Write out size 输出set的大小s.writeInt(map.size());// Write out all elements in the proper order. 按适当顺序写出所有元素。for (Iterator i=map.keySet().iterator(); i.hasNext(); )s.writeObject(i.next());    }// 反序列化    private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException {// Read in any hidden serialization magics.defaultReadObject();        // Read in HashMap capacity and load factor and create backing HashMap        int capacity = s.readInt();        float loadFactor = s.readFloat();        map = (((HashSet)this) instanceof LinkedHashSet ? new LinkedHashMap<E,Object>(capacity, loadFactor) :               new HashMap<E,Object>(capacity, loadFactor));        // Read in size        int size = s.readInt();// Read in all elements in the proper order.for (int i=0; i<size; i++) {            E e = (E) s.readObject();            map.put(e, PRESENT);        }    }}


0 0