首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >满分回答: ArrayList与LinkedList区别

满分回答: ArrayList与LinkedList区别

作者头像
一个架构师
发布2022-06-20 20:06:42
发布2022-06-20 20:06:42
4100
举报

当有人问你ArrayList与LinkedList的区别时, 一般的回答都是:

ArrayList是数组结构, 插入和查找比较快; LinkedList是双向链表结构, 删除比较快;

但这样的回答, 只能算是及格, 需要细化更多点再回答才行.

1.ArrayList是数组结构, 插入效率很高;

但确定好初始容量之后, 性能会更高.

在使用无参构造函数初始化时, 内部只会创建一个空数组;

代码语言:javascript
复制
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

在添加元素时, 会进行容量计算和扩容等操作, 性能自然也就被拖下来了.

具体操作:

1.容量计算

2.申请新数组空间

3.数组拷贝

代码语言:javascript
复制
private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    elementData = Arrays.copyOf(elementData, newCapacity);
}

2.ArrayList修改节点时,时间复杂度是O(1), 性能非常高.

3.ArrayList删除节点时, 会涉及到后续元素的迁移, 存在数组拷贝操作, 性能也就很差, 时间复杂度看起来是O(1), 其实是O(N).

代码语言:javascript
复制
System.arraycopy(elementData, index+1, elementData, index, numMoved);

4. LinkedList是双向链表, 在头部和尾部插入, 修改和删除时, 时间复杂度是O(1);

其他节点操作时, 因为元素的遍历查找, 时间复杂度是O(N).

注意: LinkedList这里的O(N)会比ArrayList中O(N)性能慢, 是因为LinkedList遍历时需要到内存中查找, 而ArrayList中的数据会有一部分或者全部进入CPU缓存中, 性能也就高了很多.

5. 遍历时, ArrayList使用索引遍历; LinkedList使用迭代器遍历;

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从码农的全世界路过 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档