Java中Colleciont、Map集合类的理解

先上张继承实现关系的图,有几处错了,LinkedBlockingDeque类名写错。EnumMap类未实现Map接口,但继承AbstractMap可能图是jdk8之前的吧。

Java中Colleciont、Map集合类的理解

实现List接口的:
    Vector: 线程安全;连续内存;默认容量10,构造参数可设置;扩容默认值0,0代表翻倍扩容;容量上限值=Integer.MAX_VALUE - 8;
    ArrayList: 线程不安全;连续内存;默认容量10,可设置;扩容是增加当前容量的一半;容量上限=Integer.MAX_VALUE - 8;
    CopyOnWriteArrayList: 线程写安全;连续内存;容量是实际值,add操作是创建一个新数组,大小=老数组大小+1,拷贝老数组到新数组,添加值复制到对应位置,remove操作也是创建一个新数组,对应拷贝,add/remove 都会有加锁操作;
    LinkedList: 线程不安全;同时实现 Deque接口,双向链表结构;插入,删除速度快;

实现Set接口的:
    HashSet: 线程不安全;依靠HashMap, HashTable原理实现;遍历顺序跟插入顺序无关
    LinkedHashSet: 线程不安全;继承HashSet,依靠LinkedHashMap,实现,所以iterator遍历时根据插入顺序遍历;
    TreeSet: 线程不安全;依靠TreeMap,原理实现
    ConcurrentSkipListSet: 线程安全;依靠ConcurrentSkipListMap 原理实
    CopyOnWriteArraySet: 线程安全; 依靠 CopyOnWriteArrayList 原理

实现Map接口的:
    HashMap: 线程不安全;默认容量16,最大容量=1<<30,容量大小会自动矫正2的幂大小,扩容是翻倍, 默认load factor=0.75, 当size>=容量*load factor,会掉resize()扩容;HashMap原理是将key hash值后模余容量,放到对应桶上,Node除了Key,V,hash值还指向下一节点(hash值取余相同的);HashMap遍历时最好用entrySet,除非只取Key或Value才考虑用对应的。
    LinkedHashMap: 线程不安全;继承HashMap,在此上增加一个双向链表结构,跟插入顺序一致,在遍历时iterator根据插入顺序遍历。
    ConcurrentHashMap: 线程安全; 完全支持高并发检索和不错的并发更新;和HashMap功能一致;

    ConcurrentSkipListMap: 线程安全;跳表,实现NavigableMap,key是有序,可降低查找时间;插入,删除复杂度比Hash和二叉树要高

    TreeMap: 线程不安全;二叉树原理,红黑树; 查找时间为log(N);

    WeakHashMap: 线程不安全;与HashMap有相同功能,支持k,v为null;当Key指被垃圾回收时会自动remove掉对应node;
    IdentityHashMap: 线程不安全;基于Hash Table原理实现,与Hash Map等其他Map接口类不同的是,他的key值是基于对象是否相等判断,而不是基于equal判定,也就是可以有相同值,但对象不同的key;
    EnumMap: 线程不安全;key为枚举,且在创建时制定枚举类型;内部存储为数组,key值不能为null;

    Map Iterator一旦生成后,对map进行增删,会抛出ConcurrentModificationException

实现Queue接口的:
    LinkedList:
    PriorityQueue: 线程不安全; 默认容量=11,扩容时64以下加上原来大小+2,以上加原来大小的一半;遍历iterator根据由小到大(可自定义比较函数),内部为数组, 结构是2叉数类型;不能填null;
    ArrayQueue: 线程不安全;最小容量=8;This class is likely to be faster than Stack when used as a stack, and faster than LinkedList when used as a queue.(作为栈比stack快,作为队列比LinekedList快);

    ArrayBlockingQueue: 线程安全;元素满足FIFO;必须定义容量大小,容量满时插入失败;
    DelayQueue: 线程安全; 添加元素需实现 Delayed 接口,延期时间最长的在前面;逻辑图:

Java中Colleciont、Map集合类的理解
    LinkedBlockingQueue: 线程安全;元素满足FIFO;容量默认=Integer.MAX_VALUE;队列满时则会阻塞线程,有空余时唤醒;
    SynchronousQueue: 线程安全;存入和取出操作同时存在,举例创建2个线程,一个线程存数据,设置超时(如果没有线程取,则失败),另一线程取数据,完成数据从生产者到消费者;
    PriorityBlockingQueue: 线程安全;功能类似PriorityQueue;

    LinkedBlockingDeque: 线程安全;容量默认=Integer.MAX_VALUE,不会扩容;双向链表实现并发阻塞队列,支持FIFO和FILO;