【Java集合】2 ArrayList

本文对比了ArrayList和Vector的区别,重点讨论它们的线程安全性、性能和扩容策略。同时,还详细介绍了LinkedList的特点。此外,深入剖析了ArrayList的扩容机制,包括ensureCapacityInternal()和grow()方法的运作过程。
摘要由CSDN通过智能技术生成

Vector

Q:ArrayList 和 Vector 的区别?

  1. 都是基于动态数组实现,支持随机访问,查询快,增删慢,因为要移动后续所有的元素,但 Vector 是线程安全的,ArrayList 不是线程安全的,性能更好;
  2. 底层使用对象数组保存数据,当数组满时,会自动扩容,创建新的数组,并拷贝原有数组数据,扩容后 ArrayList 容量增加 50%,Vector 增加一倍。

LinkedList

Q:ArrayList 和 LinkedList 的区别?

  1. 都不是线程安全的。
  2. ArrayList 基于动态数组实现,支持随机访问,查询快;LinkedList 基于双向链表实现,只能顺序访问,查询慢。
  3. ArrayList 快在寻址,慢在要移动元素以及可能的扩容,所以越往后,不发生扩容时,效率越高;LinkedList 快在只需修改 Entry 的引用,慢在寻址,所以越往前,效率越高;整体上,由于元素增删的不确定性,以及可能的扩容,LinkedList 增删快于 ArrayList。
  4. LinkedList 因为要存放元素、直接前驱和后继,所以会占用更多内存。

扩容机制

使用 add() 时,内部先调用 ensureCapacityInternal() ,传入 size + 1,来检查底层数组 elementData 是否需要扩容。

public boolean add(E e) {
   
    ensureCapacityInternal(size + 1); 
    elementData[size++] = e
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值