Java中List详解-程序员宅基地

技术标签: java  数据结构与算法  

List是Java中比较常用的集合类,关于List接口有很多实现类,本文就来简单介绍下其中几个重点的实现ArrayList、LinkedList和Vector之间的关系和区别。

List

List 是一个接口,它继承于Collection的接口。它代表着有序的队列。当我们讨论List的时候,一般都和Set作比较。
List中元素可以重复,并且是有序的(这里的有序指的是按照放入的顺序进行存储。
如按照顺序把1,2,3存入List,那么,从List中遍历出来的顺序也是1,2,3)。
Set中的元素不可以重复,并且是无序的(从set中遍历出来的数据和放入顺序没有关系)。

下面是Java中的集合类的关系图。从中可以大致了解集合类之间的关系

               

ArrayList、 LinkedList 和 Vector之间的区别

从上图可以看出,ArrayList、 LinkedList 和 Vector都实现了List接口,是List的三种实现,所以在用法上非常相似。他们之间的主要区别体现在不同操作的性能上。后面会详细分析。

ArrayList

ArrayList底层是用数组实现的,可以认为ArrayList是一个可改变大小的数组。随着越来越多的元素被添加到ArrayList中,其规模是动态增加的。

LinkedList

LinkedList底层是通过双向链表实现的。所以,LinkedList和ArrayList之前的区别主要就是数组和链表的区别。

数组中查询和赋值比较快,因为可以直接通过数组下标访问指定位置。

链表中删除和增加比较快,因为可以直接通过修改链表的指针(Java中并无指针,这里可以简单理解为指针。其实是通过Node节点中的变量指定)进行元素的增删。

所以,LinkedList和ArrayList相比,增删的速度较快。但是查询和修改值的速度较慢。同时,LinkedList还实现了Queue接口,所以他还提供了offer(), peek(), poll()等方法。

Vector

Vector和ArrayList一样,都是通过数组实现的,但是Vector是线程安全的。和ArrayList相比,其中的很多方法都通过同步(synchronized)处理来保证线程安全。

如果你的程序不涉及到线程安全问题,那么使用ArrayList是更好的选择(因为Vector使用synchronized,必然会影响效率)。

二者之间还有一个区别,就是扩容策略不一样。在List被第一次创建的时候,会有一个初始大小,随着不断向List中增加元素,当List认为容量不够的时候就会进行扩容。Vector缺省情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%。

ArrayList 和 LinkedList的性能对比

使用以下代码对ArrayList和LinkedList中的几种主要操作所用时间进行对比:

ArrayList<Integer> arrayList = new ArrayList<Integer>(); 
LinkedList<Integer> linkedList = new LinkedList<Integer>(); 
 
// ArrayList add 
long startTime = System.nanoTime(); 
 
for (int i = 0; i < 100000; i++) { 
    arrayList.add(i); 
} 
long endTime = System.nanoTime(); 
long duration = endTime - startTime; 
System.out.println("ArrayList add:  " + duration); 
 
// LinkedList add 
startTime = System.nanoTime(); 
 
for (int i = 0; i < 100000; i++) { 
    linkedList.add(i); 
} 
endTime = System.nanoTime(); 
duration = endTime - startTime; 
System.out.println("LinkedList add: " + duration); 
 
// ArrayList get 
startTime = System.nanoTime(); 
 
for (int i = 0; i < 10000; i++) { 
    arrayList.get(i); 
} 
endTime = System.nanoTime(); 
duration = endTime - startTime; 
System.out.println("ArrayList get:  " + duration); 
 
// LinkedList get 
startTime = System.nanoTime(); 
 
for (int i = 0; i < 10000; i++) { 
    linkedList.get(i); 
} 
endTime = System.nanoTime(); 
duration = endTime - startTime; 
System.out.println("LinkedList get: " + duration); 
 
// ArrayList remove 
startTime = System.nanoTime(); 
 
for (int i = 9999; i >=0; i--) { 
    arrayList.remove(i); 
} 
endTime = System.nanoTime(); 
duration = endTime - startTime; 
System.out.println("ArrayList remove:  " + duration); 
 
// LinkedList remove 
startTime = System.nanoTime(); 
 
for (int i = 9999; i >=0; i--) { 
    linkedList.remove(i); 
} 
endTime = System.nanoTime(); 
duration = endTime - startTime; 
System.out.println("LinkedList remove: " + duration); 

结果:

1.ArrayList add: 13265642
2.LinkedList add: 9550057
3.ArrayList get: 1543352
4.LinkedList get: 85085551
5.ArrayList remove: 199961301
6.LinkedList remove: 85768810

               

他们的表现的差异是显而易见的。在添加和删除操作上LinkedList更快,但在查询速度较慢。

如何选择

如果涉及到多线程,那么就选择Vector(当然,你也可以使用ArrayList并自己实现同步)。

如果不涉及到多线程就从LinkedList、ArrayList中选。 LinkedList更适合从中间插入或者删除(链表的特性)。 ArrayList更适合检索和在末尾插入或删除(数组的特性)。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34148508/article/details/86018279

智能推荐

【FatFs】文件系统常见应用_f_getfree-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏14次。文件系统大小之所以不是6M是因为有目录和文件信息分配表的存在,这些也会占用空间。关于返回实时时间需要RTC设备信息获取从文件系统应用层调用文件系统层的函数。f_getfree:获取空余空间路径,指向剩余扇区地址指针,指向文件系统指针(句柄)2.计算得到总的扇区个数和空扇区个数(1)计算总的扇区n_fatent:簇的数目+2;1簇 = n 个扇区;csize = n;tot_sect = 簇的数目*cisze = 扇区数目;fre_clust(通过f_getfree获得);_f_getfree

微服务架构与领域驱动设计应用实践-程序员宅基地

文章浏览阅读320次。本篇文章一共分为三个部分,分别是微服务架构的演进过程、具体实践微服务的应用技术和领域驱动设计的意识转变。微服务架构已经渗透到互联网应用的方方面面,而领域驱动设计也逐渐被业界所接收。微服务..._微服务架构和领域驱动设计

【论文精读】iNeRF-程序员宅基地

文章浏览阅读2k次,点赞2次,收藏6次。iNeRF论文精读_inerf

dubbo hessian 的java.lang.Throwable.cause: 'java.net.URISyntaxException' could not be instantiated异常-程序员宅基地

文章浏览阅读4.9k次。在请求dubbo服务的时候有时抛出异常:Caused by: com.alibaba.dubbo.remoting.RemotingException: com.alibaba.com.caucho.hessian.io.HessianFieldException: java.lang.Throwable.cause: 'java.net.URISyntaxException' could not_java.net.urisyntaxexception' could not be instantiated

探秘Linux下正确获取物理内存大小的方法与技巧_linux 内存大小-程序员宅基地

文章浏览阅读1.3k次。在Linux系统中,正确获取物理内存大小是一个非常重要的任务。物理内存大小是计算机系统性能和资源管理的关键指标之一,它直接影响到系统的稳定性和性能。在本教程中,我们将介绍几种方法和技巧,帮助你在Linux系统中准确获取物理内存大小。_linux 内存大小

Mybatis 返回Map数据-程序员宅基地

文章浏览阅读3.5w次,点赞13次,收藏50次。Mybatis 返回Map数据_mybatis 返回map

随便推点

RDKit|化学特征、药效团提取与2D药效团指纹计算-程序员宅基地

文章浏览阅读2.2k次,点赞5次,收藏19次。文章目录一、化学特征和药效团提取二、化学特征文件介绍1.化学特征(chemical features)2.FDef文件语法三、2D药效团指纹1.编码原理2.参数设置3.生成2D药效团指纹4.修改FDef设置5.Gobbi 2D药效团指纹一、化学特征和药效团提取Rdkit中有一系列基于SMARTS定义的化学特征。要对分子进行化学特征分析和计算时,需要先导入一个特征库,创建一个特征工厂,并通过特征工厂计算化学特征。先来操作一下,原理及介绍在第二部分。获取特征库:RDConfig.RDDataDir目录下_药效团指纹

【线性代数与矩阵论】矩阵的酉相似_酉相似矩阵-程序员宅基地

文章浏览阅读1.1k次,点赞20次,收藏24次。2023年11月7日#algebra。_酉相似矩阵

web3 : blockscout剖析-程序员宅基地

文章浏览阅读1.1w次,点赞40次,收藏32次。Blockscout 是第一个功能齐全的开源区块链浏览器,可供任何以太坊虚拟机 (EVM) 链使用。项目方可以下载并使用Blockscout作为其链的浏览器,用户可以轻松验证交易、余额、区块确认、智能合约和其他记录。_blockscout

Ubuntu14.04SLAM学习笔记(1)_ubuntu1404 slam-程序员宅基地

文章浏览阅读794次。最近开始做毕设,用到了SLAM技术,因此开始了解,暂定的研究目标是LSD-SLAM和ORB-SLAM。首先第一个问题是环境搭建。我使用的是ROS(机器人操作系统)来进行测试。(1)首先是安装OpenCv,建议大家不要安装OpenCv3.0以上的版本,因为版权问题ORB等一些特征点检测的方法不能使用,因为建议直接安装OpenCv2版本。(2)然后是进行ROS换配置。大家可以参考下_ubuntu1404 slam

OracleLinux的MTU问题_ora-27302: failure occurred at: sskgxpsnd2-程序员宅基地

文章浏览阅读2.3k次。ORA-00603: ORACLE server session terminatedby fatal errorORA-27504: IPC error creating OSD contextORA-27300: OS system dependentoperation:sendmsg failed with status: 105ORA-27301: OS failure message: No bufferspace availableORA-27302: failure occurred _ora-27302: failure occurred at: sskgxpsnd2

人工智能发展与展望(2020AI开发者大会-张钹院士)_张钹院士:人工智能的现状与未来发展报告-程序员宅基地

文章浏览阅读704次。很成功的一个例子:沃森沃森就是把网络中的数据构造成计算机能够利用的语料库。是不是信得过比如:还不足以建立要提高可信度、可靠性、可解释性等。结构化的环境(确定的环境,比如服务大厅里的),机器人还是可以应用的;非结构化,比如自动驾驶就还不可以。安全性:人脸识别攻防,人脸识别很容易造假。创新!!!!!!!!!..._张钹院士:人工智能的现状与未来发展报告

推荐文章

热门文章

相关标签