1. List
名称 | 特点 | get(index) | add(E) | add(index, E) | remove(E) |
---|---|---|---|---|---|
ArrayList | 高效,线程不安全 | O(1) | O(1) | O(n) | O(n) |
LinkedList | 删除更高效,查询低效 | O(n) | O(1) | O(n) | O(1) |
Vector | 低效,线程安全 | O(1) | O(1) | O(n) | O(n) |
ArrayList
- 底层是数组
- 默认装Object
- 初始为10,(Jdk8之后默认添加数据的时候才开始给默认长度)。
- 每次扩容是原长度的一半(取整):第一次扩到15,第二次22
- 扩容方式:Arrays.copyOf,默认把原数组复制到新数组
- 不是线程安全的
- 手写一个Demo证明ArrayList是线程不安全的
public static void main(String[] args) {
List<String> list = new ArrayList<>();
for(int i = 0; i < 30; i++){
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0, 8));
System.out.println(list);
}, String.valueOf(i)).start();
}
}
2. Set
名称 | 特点 | add(E) | remove(E) | contains(E) |
---|---|---|---|---|
HashSet | 线程不安全,可存储null值 | O(1) | O(1) | O(1) |
LinkedHashSet | 查询时有序 (存储还是无序) | O(log n) | O(log n) | O(log n) |
TreeSet | 可根据指定值排序(基于红黑树) | O(1) | O(1) | O(1) |
HashSet
-
底层是Map,初始大小为16
-
添加过程
3. Map
名称 | 特点 | get(key) | put(key) |
---|---|---|---|
HashMap | 线程不安全,高效 | O(1)~O(log n) | O(1) |
LinkedHashMap | 查询时有序 (存储还是无序) | O(1)~O(log n) | O(1) |
TreeMap | 可根据指定值排序(取决于Compare返回值) | O(log n) | O(1) |
Hashtable | 线程安全,低效 | O(1)~O(log n) | O(1) |
Properties | 键值对都是String类型 | O(1)~O(log n) | O(1) |
HashMap
- 底层:数组 + 链表 + 红黑树
- 首次添加操作创建数组,长度16,存的是一维数组Entry[]
- 扩容:超过临界值(Capacity * Load Factory),则扩容为原来2倍,并将元数据复制过来。
- 添加过程