【八股文】ArrayList和LinkedList的区别

先讲讲两者是如何实现的

ArrayList

java 复制代码
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    
    transient Object[] elementData; 

    private int size;
}

通过源码可以看出,ArrayList实现是基于数组实现的

LinkedList

java 复制代码
public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
    transient int size = 0;

    /**
     * Pointer to first node.
     */
    transient Node<E> first;

    /**
     * Pointer to last node.
     */
    transient Node<E> last;
}

private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;
}

通过源码可以看出,LinkedList实现是基于双向链表的数据结构。

使用双向链表而不使用单链表是为了能支持反向遍历,快速删除尾部元素

接下来,我们分析下不同操作的情况下,它两的差异

列表头部插入

ArrayList每次头插都需要移动所有元素, 时间复杂度O(n^2)

LinkedList只需要修改指针,时间复杂度O(n)

随机访问

ArrayList直接通过索引计算内存地址,时间复杂度O(1)

LinkedList需要从头节点开始遍历,时间复杂度O(n)

空间复杂度对比

LinkedList比ArrayList多占用数倍的空间,因为LinkedList要多存前后指针等信息

总结

最后留两个问题给大家思考下

java 复制代码
//list是linkedlist
for(int i=0; i<list.size(); i++){
    System.out.println(list.get(i));
}
java 复制代码
for(String s : list){
    if(s.equals("bug")){
        list.remove(s);
    }
}

上述代码有啥问题?

相关推荐
nice_lcj5203 分钟前
排序(4)-归并排序专题——归并排序的分治美学
java·数据结构·算法·排序算法
我登哥MVP6 分钟前
SpringCloud 核心组件解析:服务调用和负载均衡
java·spring boot·后端·spring·spring cloud·java-ee·负载均衡
插件开发6 分钟前
英伟达cuda程序通用性关键 geforce 20xx代到最新版 在20xx上编译的c++程序可以通用吗?
java·c++·人工智能
JackSparrow4148 分钟前
彻底理解Java NIO(三)Java实现 I/O多路复用+Reactor模式及开源框架代码解读
java·c语言·开发语言·后端·nio·reactor模式
程序员黑豆8 分钟前
AI全栈开发 - Java:数据类型
java·前端
曹牧10 分钟前
Java:Xml中的大、小于
java·开发语言
zavoryn11 分钟前
Jackson 序列化踩坑:LocalDateTime、Long 精度丢失和 boolean isXxx 字段
java·开发语言·后端
江华森12 分钟前
Tomcat 10 实战部署指南:从零到生产级 Web 容器
java·前端·tomcat
曹牧12 分钟前
Java:XML转义
xml·java·开发语言
心之伊始14 分钟前
Dubbo 3 Consumer 调用链路源码分析:从 Proxy 到 Cluster、Directory、Router、LoadBalance
java·微服务·dubbo·源码分析·服务治理