java里面List接口有两个实现ArrayList 和 LinkedList,他们的实现原理分别是c语言中介绍的数组和链表。正如学习数据结构时的认识,对于插入操作,链表的结构更高效,原因是可以通过修改节点的指针 就可以完成插入操作, 而不像数组,需要把插入位置之后的数组元素依次后移。

    ArrayList和数组很相似,底层实现使用的也是数组组织数据,ArrayList是动态可变数组,下标是从0开始的。ArrayList有数组的查询速度快的有点以及增删速度慢的缺点。

ArrayList有一个add(Object o)的方法用于插入数组

    LinkedList的底层是一种双向循环链表,在链表的每一个数据结点都由三部分组成:前指针、数据、后指针。最后一个节点的后指针指向第一个节点的前指针形成了一个循环。双向循环链表的查询效率低但是增删数据的话速度很快,只需要修改指针就可以了。

    可以粗略的说:ArrayList和LinkedList在代码的编写上没有什么大的区别但是在功能和性能上还是有一些差别的,一个底层是数组结构,一个底层是链表结构那么适用的场景也会有所不同,第一个适用于查询操作较为频繁的场景;第二个适用于增删数据较为频繁的场景。

LinkedList提供下述方法:

addFirst()

removeFirst()

addLast()

removeLast()

在这里参考网上一篇文章比较一下二者的性能:

package play;
import java.util.*;
public class ListTest {public static void main(String[] args) {List<String> arrayList = new ArrayList<String>();List<String> linkedList = new LinkedList<String>();long time_start1 = System.currentTimeMillis();for(int i = 0; i < 1000000; i++) {arrayList.add(new String("abc"));}long time_start2 = System.currentTimeMillis();for(int i = 0; i < 1000000; i++) {linkedList.add(new String("abc"));}long time_start3 = System.currentTimeMillis();System.out.println("ArrayList和LinkedList分别插入一百万个字符串耗时为:");System.out.println("arrayList.insert_time = " + (time_start2 - time_start1));System.out.println("linkedList.insert_time = " + (time_start3 - time_start2));long time_start4 = System.currentTimeMillis();for(int i = 0; i < 1000000; i++){Random ran = new Random();int random = ran.nextInt(10000);String temp = arrayList.get(random);}long time_start5 = System.currentTimeMillis();for(int i = 0; i < 1000000; i++){Random ran = new Random();int random = ran.nextInt(10000);String temp = linkedList.get(random);}long time_start6 = System.currentTimeMillis();System.out.println("ArrayList和LinkedList分别生成并读出一百万个10000以内的随机数耗时为:");System.out.println("arrayList.read_time = " + (time_start5 - time_start4));System.out.println("linkedList.read_time = " + (time_start6 - time_start5));}
}

结果如下:

ArrayList和LinkedList分别插入一百万个字符串耗时为:
arrayList.insert_time = 93
linkedList.insert_time = 160
ArrayList和LinkedList分别生成并读出一百万个10000以内的随机数耗时为:
arrayList.read_time = 140
linkedList.read_time = 17737

其实不用多说什么,差距已经很明显了, 当List存储的内容不多时,写入List的最后的元素,ArrayList和LinkedList用时差不多。但是当List存储的元素个数很大时,通过数组结构实现的ArrayList插入到最后可以通过数组下标很快访问到,但是LinkedList就需要访问每个节点直到找到最后的元素再进行插入操作,这中操作步骤的耗时是巨大的,所以列表数量越大,LinkedList就越感吃力了。当然,对于要求随机插入的场景,这个时候LinkedList就要比ArrayList适合了。

Java中的list---ArrayList与LinkedList相关推荐

  1. 【重难点】【Java集合 03】ArrayList、LinkedList、 Vector 和 Stack 的区别、CopyOnWriteArrayList

    [重难点][Java集合 03]ArrayList.LinkedList 和 Vector 的区别.util 包下的 List.CopyOnWriteArrayList 文章目录 [重难点][Java ...

  2. JAVA集合一:ArrayList和LinkedList

    JAVA集合一:ArrayList和LinkedList 参考链接: HOW2J.CN 前言 这几篇博客重点记录JAVA的几个重要的集合框架:ArrayList.LinkedList.HashMap. ...

  3. java中Array和ArrayList区别 可以将 ArrayList想象成一种会自动扩增容量的Array

    java中Array和ArrayList区别 1)精辟阐述: 可以将 ArrayList想象成一种"会自动扩增容量的Array https://blog.csdn.net/ywjy10280 ...

  4. Java中Array和ArrayList之间的9个区别

    array和ArrayList都是Java中两个重要的数据结构,在Java程序中经常使用. 即使ArrayList在内部由数组支持,了解Java中的数组和ArrayList之间的差异对于成为一名优秀的 ...

  5. Java中遍历删除ArrayList中多个元素

    Java中遍历删除ArrayList多个元素 Iterator itr = list.iterator(); while(itr.hasNext()) {int i = itr.next();if ( ...

  6. 将java中数组转换为ArrayList的方法实例(包括ArrayList转数组)

    方法一:使用Arrays.asList()方法 1 2 String[] asset = {"equity", "stocks", "gold&quo ...

  7. Java 对比Vector、ArrayList、LinkedList

    ①引言 在日常生活中能高效的管理和操作数据是非常重要的.Java提供了强大的集合框架,大大提高了开发者的生产力,今天就了解一下有关集合框架方面的问题. Vector.ArrayList.LinkedL ...

  8. java集合框架05——ArrayList和LinkedList的区别

    前面已经学习完了List部分的源码,主要是ArrayList和LinkedList两部分内容,这一节主要总结下List部分的内容. List概括 先来回顾一下List在Collection中的的框架图 ...

  9. JAVA中實現鏈表 LinkedList的使用

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! impo ...

  10. java中Array和ArrayList区别

    2019独角兽企业重金招聘Python工程师标准>>> 1)精辟阐述: 可以将 ArrayList想象成一种"会自动扩增容量的Array". 2)Array([] ...

最新文章

  1. 使用metasploit中Evasion模块
  2. WebUI中DataGrid多层表头的终极解决办法
  3. SparkStreaming使用checkpoint存在的问题及解决方案
  4. 用python玩转数据第四周答案_2020大学mooc用Python玩转数据课后答案
  5. 004_Icon图标
  6. 【UGV】32版UGV原理图
  7. 【AutoML】进化算法如何用于自动模型搜索(NAS)
  8. 删除排序数组中的重复数字 II
  9. 第六章 SpringCloud之Ribbon负载均衡
  10. 【Linux系统编程】进程间通信之无名管道
  11. html颜色渐变讲解,20个网页设计中渐变色运用实例欣赏
  12. .NET Core 实现定时抓取博客园首页文章信息并发送到邮箱
  13. Mysql的高可用方案及主从详细配置
  14. 免费人脸识别工具可以跟踪社交媒体网站上的人
  15. PAT1104 Sum of Number Segments精度问题
  16. 软件c#语言调用摄像头,C#中如何使用AForge实现摄像头录像功能
  17. Syntax error: ( unexpected (expecting fi) ubuntu上sh脚本报错解决办法
  18. HTTP接口测试工具及使用
  19. 行人车辆检测与计数系统(Python+YOLOv5深度学习模型+清新界面)
  20. 备考通信复试过程中的一些知识点总结梳理——发信之前(调制)

热门文章

  1. Downloading Quest SQL Optimizer for Oracle
  2. nginx cache配置
  3. 实现两线程的同步一(wait/notify)
  4. OpenCV2计算机编程手册(二)基于类的图像处理
  5. 使用Async方法 Using Async Methods 精通ASP-NET-MVC-5-弗瑞曼 Listing 4-32.
  6. Numpy、SciPy、MatPlotLib在Python2.7.9下的安装与配置
  7. [小工具] 文本形式转储二进制
  8. Cocos2d 利用继承Draw方法制作可显示三维数据(宠物三维等)的三角形显示面板...
  9. 实现 int 类型(比如id)的模糊查询
  10. 初次接触ruby的困惑