1.List
1.1 ArrayList
内部数组实现,可以快速随机访问。数组大小不满足时,已有数组复制到新的空间中。适合查找遍历。
线性安全 Collections.synchronizedList
List synchronizedList = Collections.synchronizedList(new ArrayList<>());
1.2 Vector
数组实现,支持线程同步,因此访问慢
1.3 LinkedList
链表结构,适合插入删除,有操作表头,表尾的方法,当做栈,队列,双向队列使用
2.Set
对象相等性是对象hashCode值(根据内存地址计算),俩个对象相同,必须覆盖hashCode和equals方法
2.1 HashSet
HashSet 首先判断两个元素的哈希值,如果哈希值一样,接着会比较
equals 方法 如果 equls 结果为true ,HashSet 就视为同一个元素。如果equals 为false 就不是同一个元素。
2.2 TreeSet
- 按照二叉树原理对add新对象排序
- 自定义对象必须实现Comparable接口且覆盖compareTo函数
2.3 LinkedHashSet
使用LinkedHashMap保存元素,继承HashSet,方法上与其相同
3.Map
3.1 HashMap
- 根据键的hashCode 值存储数据
- 非线程安全,使用Collections 的synchronizedMap或ConcurrentHashMap
3.1.1 Java 7实现
整体是数组,数组中每个元素是单向链表,扩容后为当前2倍
根据hash值定位到数组下标,但是需要顺着链表一个个比较下去才能找到我们需要的,时间复杂度取决于链表的长度,为 O(n)
3.1.2 Java 8实现
链表元素超过8个,将链表转化为红黑树。O(logN)
3.2 ConcurrentHashMap
整个 ConcurrentHashMap 由一个个 Segment 组成,Segment 代表”部分“或”一段“的意思,所以很多地方都会将其描述为分段锁。
3.2.1 线程安全
Segment 通过继承ReentrantLock 来进行加锁,所以每次需要加锁的操作锁住的是一个 segment,这样只要保证每个Segment 是线程安全的,也就实现了全局的线程安全。
3.2.2 Java7
- 并行度concurrencyLevel:默认16,有16个segments段,最多支持同时16个线程并行写,该参不可扩容
3.2.3 Java8
引入红黑树
3.3 HashTable
遗留类