让星星⭐月亮告诉你,LinkedList和ArrayList(指定位置/头尾增加删除)

简介: 这段代码通过对比 `ArrayList` 和 `LinkedList` 在不同位置插入和删除数据的性能,展示了两者在不同操作下的优劣。`LinkedList` 在头部插入数据时效率高,但在尾部插入或指定位置插入时耗时较多,因为需要移动指针。`ArrayList` 则在任何位置插入数据时耗时相对稳定,但头部插入需要移动大量数据。删除操作中,`LinkedList` 在指定位置删除数据时耗时较少,而 `ArrayList` 需要移动数据。代码中通过多次插入和删除操作,统计并输出了具体的耗时情况。

⭐⭐⭐代码执行结论🌙🌙🌙:

/*
现象:LinkedList在指定位置采用add(index,data)方式增加数据时,位置越靠前耗时越少,越靠后耗时越多(而ArrayList采用add(index,data)方式的耗时跟位置关系不大);
原因:虽说LinkedList底层属于链表数据结构,不需要开辟一块连续的内存地址空间,逻辑上连续即可,在新增、插入和删除操作上占优势(只需要修改节点的前后指向即可,不需要移动数据);
但是因为LinkedList在插入时需要先移动指针到指定节点, 才能开始插入,一旦要插入的位置比较远,LinkedList就需要一步一步的移动指针, 直到移动到插入位置;
这就解释了, 为什么节点所在位置越靠后, 耗时越长, 因为指针移动需要时间。而ArrayList是数组结构, 可以根据下标直接获得位置, 这就省去了查找特定节点的时间,所以对ArrayList的影响不是特别大。

现象:LinkedList在头部add数据时(采用add(0,data)和addFirst(data)两种方式耗时差不多,都很少),耗时远远低于ArrayList(采用add(0,data));
原因:不像指定位置一样不需要移动指针,也不需要像ArrayList一样由于连续地址的原因移动数据。

现象:LinkedList在尾部add数据时采用指定位置add(lastIndex,data)的方式,ArrayList在尾部add数据时采用指定位置add(index,data)的方式,则LinkedList耗时远远高于ArrayList;
原因:跟在指定位置add(index,data)数据类似,越靠后LinkedList需要移动指针所花费的时间越多,而ArrayList查找效率本身就很高。

现象:LinkedList在尾部add数据时,如果采用addLast(data)的方式,ArrayList在尾部add数据时采用add(i)的方式,则LinkedList与ArrayList的耗时差不多;且两者的效率都比使用指定位置的方式有了极大提升
原因:LinkedList不像指定位置的方式那样,不再需要移动指针到指定位置;ArrayList不再像指定位置的方式那样,不再需要查询索引位置。

现象:LinkedList在remove(index)指定位置的数据时,位置越靠前耗时越少,越靠后耗时越多;
原因:跟在指定位置插入数据类似,越靠后移动指针所花费的时间越多。

现象:LinkedList在remove(Object)指定的数据时,耗时远少于ArrayList;
原因:不像指定位置一样不需要移动指针,也不需要像ArrayList一样由于连续地址的原因移动数据。
*/

public class TestArrayList {
   
    private static final int index = 100000;
    static List<Integer> list = null;
    public static void main(String[] args) {
   
        //测试ArrayList和LinkedList的插入效率
        addElementInList(list, "ArrayList");
        addElementInList(list, "LinkedList");
        //测试ArrayList和LinkedList的查询效率

    }

    private static void addElementInList(List<Integer> list, String type){
   
        if(type == "ArrayList"){
   
            list = new ArrayList();
            for(int i = 0; i < index; i++){
   
                list.add(i);
            }
        }
        if(type == "LinkedList"){
   
            list = new LinkedList();
            for(int i = 0; i < index; i++){
   
                list.add(i);
            }
        }
        long begin = System.currentTimeMillis();
//        int n = 20000;
        int n = index;
//        int n = 0;
        for(int i = 0; i < index; i++){
   
            if(type == "LinkedList"){
   
                list.add(n,i);
//                ((LinkedList)list).addLast(i);
//                ((LinkedList)list).addFirst(i);
            }else{
   
                list.add(n,i);
//                list.add(i);
            }
        }

        long end = System.currentTimeMillis();
        System.out.printf("在%s集合的索引为%d的位置插入%d条数据,总耗时为%d毫秒\n", type,n, index, end - begin);


        /*long begin2 = System.currentTimeMillis();
        for(int i = 0; i < index/6; i++){
            if(type == "LinkedList"){
                ((LinkedList)list).remove(i);
//                ((LinkedList)list).remove((Object)i);
//                ((LinkedList)list).remove();
            }else{
                ((ArrayList)list).remove(i);
//                ((ArrayList)list).remove((Object)i);
            }
        }
        long end2 = System.currentTimeMillis();
        System.out.printf("在%s集合remove(index)%d条数据,总耗时为%d毫秒\n", type, index, end2 - begin2);*/

        long begin2 = System.currentTimeMillis();
        for(int i = 0; i < index; i++){
   
            if(type == "LinkedList"){
   
//                ((LinkedList)list).remove(i);
                ((LinkedList)list).remove((Object)i);
//                ((LinkedList)list).remove();
            }else{
   
//                ((ArrayList)list).remove(i);
                ((ArrayList)list).remove((Object)i);
            }
        }
        long end2 = System.currentTimeMillis();
        System.out.printf("在%s集合remove(Object)%d条数据,总耗时为%d毫秒\n", type, index, end2 - begin2);
    }

}
目录
相关文章
|
大数据 数据挖掘 BI
几款主流的App统计工具解析:友盟、Talking Data、openinstall
本文简要分析友盟、Talking Data、openinstall的优劣势以及特点,希望能给入门人员一点帮助
6479 0
阿里巴巴开发规约之代码格式
    1.如果括大号内没内容那么不换行,     2.小括号变量不能与括号有空格     3.如果/对/同时/开关/做保留等字与括号之间必须加空格     4.
1897 0
|
7月前
|
SQL Java 索引
IDEA 2026.1 重磅更新:Java 开发效率翻倍的核心新特性全拆解
IDEA 2026.1重磅发布:启动/索引/内存全面优化,冷启提速40%、热启秒开;原生支持JDK 17–23,深度集成虚拟线程调试与重构;AI辅助编码、MyBatis XML一键转MP、分布式链路调试、K8s原生集成,Java开发效率跃升新高度。
1711 1
|
SQL 关系型数据库 MySQL
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
MySQL慢查询优化、索引优化,是必知必备,大厂面试高频,本文深入详解,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
|
存储 算法 数据处理
Pandas高级数据处理:数据加密与解密
在数字化时代,数据安全至关重要。Pandas作为Python的强大数据分析库,结合`cryptography`等加密库,可实现数据的高效加密与解密。本文介绍如何使用Pandas进行数据加密,涵盖对称加密、非对称加密及哈希算法,并提供常见问题及解决方案,确保敏感信息的安全性。通过示例代码演示加密流程,帮助读者掌握数据加密技术,提升数据安全性。
443 1
|
安全 Java 程序员
Java集合之战:ArrayList vs LinkedList,谁才是你的最佳选择?
本文介绍了 Java 中常用的两个集合类 ArrayList 和 LinkedList,分析了它们的底层实现、特点及适用场景。ArrayList 基于数组,适合频繁查询;LinkedList 基于链表,适合频繁增删。文章还讨论了如何实现线程安全,推荐使用 CopyOnWriteArrayList 来提升性能。希望帮助读者选择合适的数据结构,写出更高效的代码。
1209 3
|
SQL 存储 Oracle
一次搞定各种数据库SQL执行计划
执行计划(execution plan,也叫查询计划或者解释计划)是数据库执行 SQL 语句的具体步骤,例如通过索引还是全表扫描访问表中的数据,连接查询的实现方式和连接的顺序等。如果 SQL 语句性能不够理想,我们首先应该查看它的执行计划。
一次搞定各种数据库SQL执行计划
|
SQL 前端开发 Java
在IDEA中使用Maven将SpringBoot项目打成jar包、同时运行打成的jar包(前后端项目分离)
这篇文章介绍了如何在IntelliJ IDEA中使用Maven将Spring Boot项目打包成可运行的jar包,并提供了运行jar包的方法。同时,还讨论了如何解决jar包冲突问题,并提供了在IDEA中同时启动Vue前端项目和Spring Boot后端项目的步骤。
在IDEA中使用Maven将SpringBoot项目打成jar包、同时运行打成的jar包(前后端项目分离)
|
监控 Java 数据库
Spring事务中的@Transactional注解剖析
通过上述分析,可以看到 `@Transactional`注解在Spring框架中扮演着关键角色,它简化了事务管理的复杂度,让开发者能够更加专注于业务逻辑本身。合理运用并理解其背后的机制,对于构建稳定、高效的Java企业应用至关重要。
863 0
|
SQL 关系型数据库 数据库连接
"Nacos 2.1.0版本数据库配置写入难题破解攻略:一步步教你排查连接、权限和配置问题,重启服务轻松解决!"
【10月更文挑战第23天】在使用Nacos 2.1.0版本时,可能会遇到无法将配置信息写入数据库的问题。本文将引导你逐步解决这一问题,包括检查数据库连接、用户权限、Nacos配置文件,并提供示例代码和详细步骤。通过这些方法,你可以有效解决配置写入失败的问题。
1141 0

热门文章

最新文章