集合整理
一、概述
集合顶层分为 Collection和Map
其中Collection分为list和set
list有Arraylist、vector、linkedlist
ArrayList存取有序,可重复,底层是用数组,查询速度快,增删速度慢,线程不安全,扩容倍数是1.5倍+1
vector存取有序,可重复,底层是数组,查询速度快,增删慢,线程安全效率低,默认扩展一倍容量
linkedlist存取有序,可重复,底层使用双向循环列表数据结构,查询速度慢,增删快,线程不安全,有专门用于操作表头和表尾的方法,可以当做堆、栈、队列和双向队列使用
总结:所有的list集合都是存取有序,可重复的,区别是底层是数组的查询快,增删慢,底层是链表的查询慢,增删快。
set集合分为hashset、TreeSet、linkedHashSet
HashSet:存取无序,不可重复,底层使用Hash表实现,存取速度快,内部是HashMap
TreeSet:存取无序,不可重复,但是是排序存储,或者升序,或者降序,存储自定义对象的时候,要实现comparable接口,重写compareTo函数,规定排序规则,底层使用二叉树。
LinkedHashSet:存取有序,因为使用Hash表存储,使用双向链表记录插入顺序,内部是LinkedHashMap
总结:HashSet存取无序,不可重复,TreeSet,存取无序,但是排序存储。LinkedHashSet存取有序,不可重复。
Map集合有:HashMap、HashTable、TreeMap
HashMap:键不可重复,值可重复,底层是数组+链表+红黑树、线程不安全、允许key值为null只允许一条,value也可以为null可以多条。
capacity:扩容为2倍,loadFactor:负载因子为0.75.
每个存储单位包括:key、value、hash、单向链表的next。
扩容的阈值是capacity*loadFactor
链表数据超过八个,链表会进化成红黑树,减少到6个会退回链表
ConcurrentHashMap
ConcurrentHashMap是hashMap的线程安全版本。它由一个个的Segment组成,可以理解成部分、一段、分段锁或者槽来理解。
Segment通过集成Reentrantlock来进行加锁,所以每次并发操作,锁住的是segment,以此来实现并发安全。
concurrenthashmap的并行度默认是16,也就是理论上最多可以同时支持十六个线程并发写。这个值初始化的时候可以改变,一旦初始化后不可以扩容。
其实可以看成concurrentHashMap是HashMap的集合,每个segment都是一个HashMap。
HashTable:键不可重复,值可重复,底层哈希表,线程安全,key、value不允许为null。
TreeMap:键不可重复,值可重复,底层二叉树。有自然排序,按照倒叙(按着插入顺序的倒叙)的方法取出,有定制排序,自己定制排序规则
总结:Map的键都不可重复,值可重复,其中HashMap的key允许一次空值,value可以多条都是空值。map线程不安全,hashtable和concurrenthashmap线程安全,concurrenthashmap并发更高。treemap排序存储。