首页 > 编程语言 >Java中队列和链表性能对比-ArrayList和LinkedList

Java中队列和链表性能对比-ArrayList和LinkedList

时间:2022-10-01 16:11:39浏览次数:55  
标签:node util Java LinkedList ArrayList 链表 new

本文使用ArrayList和LinkedList,分别对比了队列链表的add,get的性能。

 

具体代码如下,可以直接运行

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Demo07_list {

    public static void main(String[] args) {
        List<Integer> link = new LinkedList<Integer>();
        List<Integer> list = new ArrayList<>();
        Integer m = new Integer(10);


        int time1 = (int) System.currentTimeMillis();
        for (int i=0;i<1000000;i++){
            link.add(m);
        }
        int time2 = (int) System.currentTimeMillis();
        System.out.println(time2 - time1);

        int time3 = (int) System.currentTimeMillis();
        for (int j=0;j<1000000;j++){
            list.add(m);
        }
        int time4 = (int) System.currentTimeMillis();
        System.out.println(time4 - time3);

        /**
         * 像上面这种for循环逐个新增,其实link和list效率差别不大。link有底层维护可以直接找到的lastnode,list可以直接index找到last
         * link效率高的地方是insert,只需要挪动一个;list需要所有挪动
         *
         */

        time1 = (int) System.currentTimeMillis();
        for(int i=0;i<1000000;i++){
            link.get(i);
        }
        time2 = (int) System.currentTimeMillis();
        System.out.println(time2 - time1);

        time3 = (int) System.currentTimeMillis();
        for (int j=0;j<1000000;j++){
            list.get(m);
        }
        time4 = (int) System.currentTimeMillis();
        System.out.println(time4 - time3);

        /**
         * get的时候每次获取,link都需要从头遍历;list只需要index就可以找到对应的元素
         *
         */
    }
}

  

最终输出结果

16
11
340337
3

 

其中get耗时较久。最终结果如同上一篇博客中提到的两者差距(但是其实实际结果add的时候,性能差别不是特别大,可以是因为数据类型的问题)

 

底层结构

增删效率

改查的效率

ArrayList

可变数组

较低,通过数组扩容

较高,不需要改变数组

LinkedList

双向链表

较高,通过链表追加

较低,需要通过node一个个遍历找到后操作

如何选择?

  • 如果改查操作较多,选择ArrayList
  • 如果增删操作较多,选择LinkedList
  • 一般来说在程序中大多数都是查询,因此大部分情况下会选择ArrayList
  • 不适合用于多线程,LinkedList和ArrayList的线程不是安全的

 

备注:

为什么node删除总是可以找到最后一个?

node底层实际上维护了一个双向链表,看源码native修饰的node属性的对象,这就是指向的last node。

标签:node,util,Java,LinkedList,ArrayList,链表,new
From: https://www.cnblogs.com/cccrush/p/16747320.html

相关文章

  • Java 集合框架之Collection,一文解决
     JDK提供了一些特殊的类,这些类可以存储任意类型的对象,并且长度可变,在Java中这些被称为集合。按照存储结构可以分为两大类,单列集合Collection和双列集合常用集合类如下......
  • 力扣209(java)-单词规律(简单)
    题目:给定一种规律pattern 和一个字符串 s ,判断s 是否遵循相同的规律。这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存......
  • Java泛型中<T> T 与 T的区别和用法
    有的方法返回值是<T>T,有的是T,区别在哪里?下面是一个泛型方法,<T>声明此方法有一个泛型T,也可以理解声明一个泛型方法.    下面三个T,第一个T表示是泛型,第二个......
  • 肖sir___第二个月Javascript_04
    1.1JavaScript简介JavaScript是互联网上最流行的脚本语言,这门语言可用于HTML和web,更可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备JavaScript是......
  • 肖sir___第二个月java操作JDBC_02
    1.1JDBC概述JDBC(JavaDataBaseConnectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。各种不同......
  • Java之POI导出Excel(一):单sheet
    相信在大部分的web项目中都会有导出导入Excel的需求,今天我们就来看看如何用Java代码去实现用POI导出Excel表格。一、pom引用pom文件中,添加以下依赖查看代码 <!--Exc......
  • 肖sir_Java注解__22
    Java注解 1.1注解介绍从Java5版本之后可以在源代码中嵌入一些补充信息,这种补充信息称为注解(Annotation),注解是Java平台中非常重要的一部分。注解都是@符号开头,......
  • 肖sir_Java 8 新特性__21
    1.1Lambda表达式Lambda表达式,也可称为闭包,它是推动Java8发布的最重要新特性。Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。语法1,(parameters......
  • Java 数组
    1.数组的定义数组是相同类型数据的有序集合。数字描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作数组元素,每一个数组元素可以通过......
  • 集合框架——LinkedList集合源码分析
    目录示例代码底层代码第1步(初始化集合)第2步(往集合中添加一个元素)第3步(往集合中添加第二个元素)第4步(往集合中添加第三个元素)LinkedList添加元素流程示意图第5步(删除集合中第......