【深入浅出】Java集合 ArrayList与LinkedList异同

ArrayList

1. 基本特点
  • 基于动态数组实现,支持随机访问。

  • 顺序容器,数据存放顺序和存入顺序相同。

  • 因为Java的泛型为编译器支持的语法糖,所以该数组为Object数组,支持所有类型的对象。(其他类型对象数据进入后,源码中构造方法使用toArray()转化为Obeject类型数组。)

  • 因为追求速度,未实现同步,不支持多线程并发访问,可使用线程安全的vector

2. 相关方法
  • size(),isEmpty(),get(),set()均为O(1)

  • add()方法开销与数据插入位置成正比

  • addAll()方法开销与插入数量成正比

3. 自动扩容特性
  • 使用 ensureCapacity()方法

  • 将老数组中的元素重新拷贝一份到新的数组中,每次数组容量的增长大约是其原容量的1.5倍。

  • 对象能否被GC的依据是是否还有引用指向它或对应的位置被其他元素覆盖,所以数组最后一个位置必须显式赋为null,,否则原来的对象就一直不会被回收

LinkedList

1. 基本特性
  • 基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素,首段或者末尾删除元素只需要O(1) 。

  • LinkedList 还可以用作栈、队列和双向队列

  • 未实现同步,不支持多线程并发访问,非线程安全,可以使用 Collections.synchronizedList() 方法对其进行包装。

2. 方法实现
  • 内部两个指针first和last,分别指向链表内第一个和最后一个节点元素。

  • clear()方法,为了指针GC更快可以回收放置的元素,需要将要回收的节点之间的引用关系赋空。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值