集合框架源码分析三(实现类篇ArrayList,LinkedList,HashMap)
一。ArrayList,可自动扩充容量的动态数组
二。LikedList(双向循环链表)
三。HashMap(数组加链表的结合体)
四。HashSet/** * 散列集(hashSet),就是不存在重复元素的集合。 * HashSet是在HashMap的基础上实现的, * 以HashSet的元素做Key值使其值不会重复 * */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;//以Object作为虚假的Value值private static final Object PRESENT = new Object();/** * * 构造一个新的,空Set集; * 实际是构造一个默认初始容量为16,加载因子为0.75的空HashMap */public HashSet() {map = new HashMap<E, Object>();}/** * * 构造一个包含指定集合c中所有元素的新的Set集。 * 实际是构造包含集合c中所有元素的HashMap. * 初始大小必须大于容量*0.75 * */public HashSet(Collection<? extends E> c) {map = new HashMap<E, Object>(Math.max((int) (c.size() / .75f) + 1, 16));addAll(c);}/** * 以指定初始容量和加载因子构造HashMap */public HashSet(int initialCapacity, float loadFactor) {map = new HashMap<E, Object>(initialCapacity, loadFactor);}/** * 以初始容量构造HashMap */public HashSet(int initialCapacity) {map = new HashMap<E, Object>(initialCapacity);}/** * * 构造一个Linked hash set. * 以指定初始容量,加载因子构造LinkedHashMap,dummy只是为了区别其他构造方法 * */HashSet(int initialCapacity, float loadFactor, boolean dummy) {map = new LinkedHashMap<E, Object>(initialCapacity, loadFactor);}/** * 获得HashMap的键集迭代器 */public Iterator<E> iterator() {return map.keySet().iterator();}/** * 返回元素个数 */public int size() {return map.size();}/** * 判断Hash集是否为空 */public boolean isEmpty() {return map.isEmpty();}/** * 如果Map中含有此key则返回true */public boolean contains(Object o) {return map.containsKey(o);}/** * * 如果e不存在于Set中则添加e到集合, * 如果Map中key集不存在e,则添加并返回null,否则替换原来的value,返回oldValue * */public boolean add(E e) {return map.put(e, PRESENT) == null;}/** * 移除指定元素 */public boolean remove(Object o) {return map.remove(o) == PRESENT;}/** * 清空map */public void clear() {map.clear();}/** * 返回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();//写入HashMap的容量和加载系数s.writeInt(map.capacity());s.writeFloat(map.loadFactor());//写入sizes.writeInt(map.size());//依次写入键值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();//读取容量和加载因子构造HashMapint capacity = s.readInt();float loadFactor = s.readFloat();//判断是LinkedHashMap还是HashMapmap = (((HashSet) this) instanceof LinkedHashSet ? new LinkedHashMap<E, Object>(capacity, loadFactor): new HashMap<E, Object>(capacity, loadFactor));// 读sizeint size = s.readInt();//依次读出所有元素for (int i = 0; i < size; i++) {E e = (E) s.readObject();map.put(e, PRESENT);}}}