09Java常用类4之集合

常用集合结构

线性结构

  • List:ArrayList、CopyOnWriteArrayListVector
  • Queue: LinkedList、PriorityQueueBlockingQueueConcurrentLinkedQueue
  • Stack:extends from Vector

非线性结构

  • Set:HashSet、LinkedHashSet、TreeSet、CopyOnWriteArraySetConcurrentSkipListSet
  • Map:HashMap、TreeMap、WeakHashMap、IdentityHashMap、 LinkedHashMap 、 HashTableConcurrentHashMapConcurrentSkipListMap

集合包装类

集合包装类可以对上述的几种结构进行包装,而它在其中的返回会加入它的语义理解

  • 不可变更集合类:Collections.unmodifiableCollection,对上述结构的限定,返回不可修改的集合
  • 同步集合类Collections.synchronizedCollection,可以将任意List转换成线程安全的List
  • 可检查集合类:Collections.checkedCollection

注:其中 斜体 标注的类为线程安全类。

Java集合框架图

线性存储结构

重点选讲以 List 展开的类

ArrayList

  • 可设置初始的空间大小,在底层数组不够用时在原来的基础上扩容1.5倍

Vector

  • 可设置初始的空间大小,在底层数组不够用时在原来的基础上默认扩容2倍 (亦可设置增长的空间大小)
  • 读写方法都加了synchronized关键字,是线程安全的

CopyOnWriteArrayList

  • 利用写时复制的思想,一旦碰到写操作都会对所有元素进行复制
  • 在新的数组上修改后,重新对数组赋值引用,保证线程安全
  • 适合读多写少的应用场景

ConcurrentLinkedQueue

  • 非阻塞式队列,利用CAS算法保证入队出队线程安全
  • 进行元素遍历时是线程不安全
  • 不允许添加null元素

映射关系

WeakHashMap

  • 适用于需要缓存的场景,对entry进行弱引用管理
  • GC时会自动释放弱引用的entry项
  • 相对HashMap只增加弱引用管理,并不保证线程安全

HashTable

  • 读写方法都加了synchronized关键字
  • key和value都不允许出现null值
  • 与HashMap不同的是HashTable直接使用对象的hashCode,不会重新计算hash值

ConcurrentHashMap

  • 利用CAS+ Synchronized来确保线程安全
  • 底层数据结构依然是数组+链表+红黑树
  • 对哈希项进行分段上锁,效率上较之HashTable要高
  • key和value都不允许出现null值

问题:

为什么ConcurrentHashMap不允许插入Null值?

小测

ArrayList list = new ArrayList(20); 中的 List 扩充了几次?

初始化时直接分配大小,不存在扩充情况,所以是0次;add等操作时才可能会发生扩充。