09Java常用类4之集合
常用集合结构
线性结构
- List:ArrayList、CopyOnWriteArrayList、Vector
- Queue: LinkedList、PriorityQueue、BlockingQueue、ConcurrentLinkedQueue
- Stack:extends from Vector
非线性结构
- Set:HashSet、LinkedHashSet、TreeSet、CopyOnWriteArraySet、ConcurrentSkipListSet
- Map:HashMap、TreeMap、WeakHashMap、IdentityHashMap、 LinkedHashMap 、 HashTable、ConcurrentHashMap、 ConcurrentSkipListMap
集合包装类
集合包装类可以对上述的几种结构进行包装,而它在其中的返回会加入它的语义理解
- 不可变更集合类:Collections.unmodifiableCollection,对上述结构的限定,返回不可修改的集合
- 同步集合类:Collections.synchronizedCollection,可以将任意List转换成线程安全的List
- 可检查集合类:Collections.checkedCollection
注:其中 斜体 标注的类为线程安全类。
线性存储结构
重点选讲以 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等操作时才可能会发生扩充。