【八股文】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);
    }
}

上述代码有啥问题?

相关推荐
韩立学长几秒前
【开题答辩实录分享】以《以体验为中心的小学古诗互动学习App的设计及实现》为例进行选题答辩实录分享
java·spring·安卓
萤丰信息4 分钟前
科技赋能智慧园区:解码绿色转型的“数字密码”
java·大数据·人工智能·科技·安全·智慧城市·智慧园区
码农阿豪18 分钟前
远程调试不再难!Remote JVM Debug+cpolar 让内网 Java 程序调试变简单
java·开发语言·jvm
stillaliveQEJ22 分钟前
【JavaEE】Spring AOP(二)
java·spring·java-ee
岁岁种桃花儿29 分钟前
Spring Boot项目核心配置:parent父项目详解(附实操指南)
java·spring boot·spring
YYHPLA32 分钟前
【无标题】
java·spring boot·后端·缓存
木易 士心33 分钟前
加密与编码算法全解:从原理到精通(Java & JS 实战版)
java·javascript·算法
专注于大数据技术栈34 分钟前
java学习--ArrayList
java·学习
编程大师哥37 分钟前
JavaEE初阶的核心组件
java·java-ee
华如锦38 分钟前
MongoDB作为小型 AI智能化系统的数据库
java·前端·人工智能·算法