Collection常用子类源码注解

类图

List和set的 List_Set

公共部分

Iterable

Iterable 只有一个接口返回一组元素的迭代器,实现该接口的类都支持foreach语句

Collection

AbstractCollection

其中AbstractCollection对Collection的部分方法进行了实现(除了iterator()和size()),包含了一些List和Set共有的操作

    /**
    * @param      src      the source array. ***源数组***
    * @param      srcPos   starting position in the source array. ***源数组起始地址***
    * @param      dest     the destination array. ***目标数组***
    * @param      destPos  starting position in the destination data. ***目标数组开始的地址***
    * @param      length   the number of array elements to be copied. ***要拷贝的长度***
    * @exception  IndexOutOfBoundsException  if copying would cause
    *               access of data outside array bounds. ***length不能超过src和dest的任一长度***
    * @exception  ArrayStoreException  if an element in the <code>src</code>
    *               array could not be stored into the <code>dest</code> array
    *               because of a type mismatch. ***类型不匹配***
    * @exception  NullPointerException if either <code>src</code> or
    *               <code>dest</code> is <code>null</code>. ***src或者dest为空***
    */
   public static native void arraycopy(Object src,  int  srcPos,
                                       Object dest, int destPos,
                                       int length);

List

List接口在Collection的基础之上增加了部分list独有的操作

AbstractList

AbstractList对List接口进行了实现,并引入了SubList,Itr和ListItr三个内部类,用于实现subList和listIterator方法,并增加了一个域modCountstructurally modified的次数(transient修饰)

ArrayList

ArrayList的elementData,存储list元素的数组,并且这个域是transient(不参与序列化)修饰的,因为ArrayList重写了readObject和writeObject

ArrayList在AbstractList之外多了一些方法

Queue

Deque

LinkedList

LinkedList是基于双向循环链表来实现的,数据结构如下:

类声明,LinkedList只是把所实现的接口统统实现了下

public class LinkedList<E> extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable

双向链表的结构体

    private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

Set

set 接口和collection接口方法完全一样

AbstractSet

SortedSet

TreeSet

HashSet

  1. 实际上是通过HashMap来实现的 map.put(e, PRESENT)==null;
  2. 不保证集合元素的顺序
  3. 允许空值
  4. Set s = Collections.synchronizedSet(new HashSet(…))
  5. 其迭代器是fail-fast的,迭代器一旦创建,除了迭代器自己删除元素, 其他任何的对set的写操作都会导致迭代器抛出ConcurrentModificationException, 注意迭代器的fail-fast特性不能保证,正如在非同步化修改中做保也是不可能的. 因此通过异常来判定程序的正确性是不可取的,只能把它当做检测程序bug的手段