1. ArrayList
- 底层实现:数组,
Object[] elementData
- 查询效率高,增删效率低,线程不安全,使用评率高
- 使用评率高是因为我们平常的开发场景当中,大部分都是查询多,增删少
- 如果频繁的增删,最好使用
LinkedList
,如果需要线程安全可以使用Vector
,或者Collections.sychronizedList()
方法 - 默认的大小是 10
- 使用内存是连续的,会大幅降低读取内存的性能开销
扩容机制
- 当元素满的时候,会重新定义一个长度为
n + n >> 2
的数组,再将之前的数据复制到新数组 ArrayList
初始化的时候其实不会初始化其内部的数组大小,通过set(i, obj)
可以证明
新增删除
ArrayList
在固定位置新增的时候,其实是从这个位置i
之后的所有数据都复制到i + 1
的位置,再将i
位置的元素覆盖- 删除操作也和新增类似,将其之后
i + 1
开始的数据,复制到i
的地方
2. LinkedList
- 相比
ArrayList
没有实现RandomAccess
,优先使用增强 for 循环 - 底层数据使用的是链表,查询慢
- 内存占用空间比
ArrayList
更大,更散
3. 集合的选用
- 需要根据键值获取元素使用 Map
- 需要排序选择 TreeMap
- 不需要排序选择 HashMap
- 需要线程安全使用 ConcurrentHashMap
- 只需要防止元素时使用 Collection
- 元素唯一 Set:TreeSet、HashSet
- 不需要唯一 List:ArrayList、LinkedList