文章目录
Vector
Q:ArrayList 和 Vector 的区别?
- 都是基于动态数组实现,支持随机访问,查询快,增删慢,因为要移动后续所有的元素,但 Vector 是线程安全的,ArrayList 不是线程安全的,性能更好;
- 底层使用对象数组保存数据,当数组满时,会自动扩容,创建新的数组,并拷贝原有数组数据,扩容后 ArrayList 容量增加 50%,Vector 增加一倍。
LinkedList
Q:ArrayList 和 LinkedList 的区别?
- 都不是线程安全的。
- ArrayList 基于动态数组实现,支持随机访问,查询快;LinkedList 基于双向链表实现,只能顺序访问,查询慢。
- ArrayList 快在寻址,慢在要移动元素以及可能的扩容,所以越往后,不发生扩容时,效率越高;LinkedList 快在只需修改 Entry 的引用,慢在寻址,所以越往前,效率越高;整体上,由于元素增删的不确定性,以及可能的扩容,LinkedList 增删快于 ArrayList。
- LinkedList 因为要存放元素、直接前驱和后继,所以会占用更多内存。
扩容机制
使用 add() 时,内部先调用 ensureCapacityInternal() ,传入 size + 1,来检查底层数组 elementData 是否需要扩容。
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e