Java中List详解_weixin_34148508的博客-程序员秘密

技术标签: 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

智能推荐

优秀软件工程师的十种特质_luckhouge的博客-程序员秘密

如今,每家公司都似乎成了科技公司。从软件创业公司到投机性投资公司、制药巨头和媒体巨头,它们都越来越多地加入到软件业务行列。   代码质量不仅成为了一个必需品,更成为了一个竞争优势。因为众多公司围绕软件而竞争,开发软件的人——软件工程师正显得越发重要。但是,你该如何发现那种百里挑一的程序员呢?在本文中,我们简明扼要地列出了明星开发人员的10种特质。1. 热爱编...

Kali Linux三种网络攻击方法总结(DDoS、CC和ARP欺骗)_Andysun06的博客-程序员秘密_kali攻击教程

本文章使用的是Kali Linux的2020-4-installer-amd64版本Kali Linux的安装过程本文章不做过多说明,请自行百度一、DDos攻击首先,打开一个命令行输入以下命令:git clone https://github.com/Ha3MrX/DDos-Attack提示如图所示这样,用于DDos的数据包就已经下载到了你的Kali上下面,进入你所下载的DDos文件夹,输入命令(注意大小写):cd DDos-Attack然后设置ddos-attack.py设置_1671465600

实现两个矩阵相乘_Larkkkkkkk的博客-程序员秘密_两个矩阵相乘 代码

题目:实现两个矩阵相乘。想法: 通过分析矩阵相乘可假设变量i,j,k控制下标, 则有以下公式: c[i][j]=a[i][k]*b[k][j](三个变量循环次数:i&amp;gt;j&amp;gt;k) 所以可以使用三次循环解出相乘的每个数字。说明:我将以4*4矩阵为例说明方法。代码:#include&amp;lt;stdio.h&amp;gt;#define N...

kafka学习笔记:知识点整理_w36680130的博客-程序员秘密_学习kafka需要哪些知识

一、为什么需要消息系统 1.解耦:  允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。2.冗余:  消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据

C语言-基础入门-学习笔记(5):数组和字符串_赵小琛在路上的博客-程序员秘密

C语言-基础入门-学习笔记(5):数组和字符串一、数组1. 一维数组一维数组是用以存储一维数列中数据的集合,由四部分组成:数组名、数据类型名、数组操作符和数组容量。标准的定义方式为:...

EE师傅叫找的的_haihaiff的博客-程序员秘密

http://blog.csdn.net/windoze/archive/2004/08/01/57796.aspx一集我们讲到了“函数”,其实这个概念早在初中数学里就已经学过了,一个函数无非就是将自变量映射到值的对应关系,在Lisp里也一样。Lisp中的函数定义我们已经在上节给出(快速抢答:谁还记得请举手),在Lisp中采用如下形式描述一个函数:(lambda (p1 p2 ...

随便推点

使用ButterKnife绑定View,在代码中动态添加View,并使用ButterKnife对动态添加的View进行点击监听_一抹红颜醉的博客-程序员秘密

在Activity中使用ButterKnife绑定View,并获取监听事件普通情况下写法如下: @BindView(R.id.back) ImageView back; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);...

Nutch-1.9+solr4.6.1+tomcat8.5.29搭建一个搜索引擎(windows10)_qq_34229391的博客-程序员秘密

一、需要的工具(尽量使用下面这些版本的软件,否则的话,不知道会出现什么问题)tomcat8.5.29(选择压缩包吧,比较方便):tomcat8.5.29apache-nutch-1.9-bin.tar.gz:nutch-1.9solr-4.6.1.tgz:solr4.6.1eclipse:eclipseIK-Analyzer-2012FF:IK-Analyzer-2012FFhadoop-core...

国内三大云数据库测试对比_NicolasLearner的博客-程序员秘密

导读腾讯云数据库提供了可视化的运维操作页面和自动备份的能力,降低了数据库运维的门槛。同时云数据库还支持高可用架构,对数据的安全性和服务的可靠性更有保障。另外有的云数据库厂商还提供了诸如数据库审计、慢查询分析、数据回档等能力,大大减轻了数据库运维和 DBA 的工作量。我司 CTO 和技术总监都是腾讯系的,所以我们一开始就选用腾讯云的服务。他们家的云数据库提供了可视化的运维操作页面和自动备份的能力,降低了数据库运维的门槛。同时云数据库还支持高可用架构,对数据的安全性和服务的可靠性更有保障。另外有的云数据

jackson实体类转换json大小写及空字段忽略_wwwasw的博客-程序员秘密_实体类转换成json大写字母下加横线

实体类转换为json时,有时需要保持首字母大写或整个字段大写,而jackson序列化是默认使得首字母小写。一种实现的方法是使用jackson的注解;引入注解时注意版本:1.x annotations are in Java packageorg.codehaus.jackson.annotate, in Jackson core jar 2.x anno

@SuppressWarnings()_褚金辉的博客-程序员秘密

参数:1:deprecation:去掉过时方法警告;2:unchecked:去掉类型转换警告;

程序员如何自我学习和成长?聪明人已经收藏了!_后端面试大全的博客-程序员秘密

前言从2010年开始Android市场开始需要大量的Android开发人员,招聘市场上也开始大量招Android开发人员,大量java开发者开始学习Android开发,招聘市场面试要求上只要有一定java语法基础,都很容易应聘上Android开发的岗位,因为那时候国内Android开发的需求刚刚起步,从事Android开发的人员很少,到2011-2012年,只要有一年左右的Android开发经验,那时候在一线城市很容易拿到10K的起步薪资,那时候市场Android开发的市场空缺大概有30万左右。这时候大

推荐文章

热门文章

相关标签