Java中ArrayList和LinkedList之间的区别_动力节点Java学院整理
作者:lijiao 发布时间:2023-03-30 18:16:29
一、ArrayList
ArrayList是一个可以处理变长数组的类型,这里不局限于“数”组,ArrayList是一个泛型类,可以存放任意类型的对象。顾名思义,ArrayList是一个数组列表,因此其内部是使用一个数组来存放对象的,因为Object是一切类型的父类,因而ArrayList内部是有一个Object类型的数组类存放对象。ArrayList类常用的方法有add()、clear()、get()、indexOf()、remove()、sort()、toArray()、toString()等等,同时ArrayList内部有一个私有类实现Iterator接口,因此可以使用iterator()方法得到ArrayList的迭代器,同时,还有一个私有类实现了ListIterator接口,因此ArrayList也可以调用listIterator()方法得到ListIterator迭代器。
由于ArrayList是依靠数组来存放对象的,只不过封装起来了而已,因此其一些查找方法的效率都是O(n),跟普通的数组效率差不多,只不过这个ArrayList是一个可变”数组“,并且可以存放一切指定的对象。
另外,由于ArrayList的所有方法都是默认在单一线程下进行的,因此ArrayList不具有线程安全性。若想在多线程下使用,应该使用Colletions类中的静态方法synchronizedList()对ArrayList进行调用即可。
二、LinkedList
LinkedList可以看做为一个双向链表,所有的操作都可以认为是一个双向链表的操作,因为它实现了Deque接口和List接口。同样,LinkedList也是线程不安全的,如果在并发环境下使用它,同样用Colletions类中的静态方法synchronizedList()对LinkedList进行调用即可。
在LinkedList的内部实现中,并不是用普通的数组来存放数据的,而是使用结点<Node>来存放数据的,有一个指向链表头的结点first和一个指向链表尾的结点last。不同于ArrayList只能在数组末尾添加数据,LinkList可以很方便在链表头或者链表尾插入数据,或者在指定结点前后插入数据,还提供了取走链表头或链表尾的结点,或取走中间某个结点,还可以查询某个结点是否存在。add()方法默认在链表尾部插入数据。总之,LinkedList提供了大量方便的操作方法,并且它的插入或增加等方法的效率明显高于ArrayList类型,但是查询的效率要低一点,因为它是一个双向链表。
因此,LinkedList与ArrayList最大的区别是LinkedList更加灵活,并且部分方法的效率比ArrayList对应方法的效率要高很多,对于数据频繁出入的情况下,并且要求操作要足够灵活,建议使用LinkedList;对于数组变动不大,主要是用来查询的情况下,可以使用ArrayList。
import java.util.* ;
public class ListDemo01{
public static void main(String args[]){
List<Integer> li = new LinkedList<Integer>() ;
long startTime = System.currentTimeMillis() ;
for(int i=0;i<1000000;i++){
li.add(0,i) ; //print : 803
//li.add(i) ; //print : 790
}
long endTime = System.currentTimeMillis() ;
System.out.println(endTime-startTime) ;
}
}
下面的代码得不出结果速度太慢
import java.util.* ;
public class ListDemo01{
public static void main(String args[]){
List<Integer> li = new LinkedList<Integer>() ;
for(int i=0;i<1000000;i++){
li.add(0,i) ; //print : 803
//li.add(i) ; //print : 790
}
long startTime = System.currentTimeMillis() ;
for(int i=0;i<1000000;i++){
li.get(i) ;
}
long endTime = System.currentTimeMillis() ;
System.out.println(endTime-startTime) ;
}
}
下面化成ArrayList速度就超快
import java.util.* ;
public class ListDemo01{
public static void main(String args[]){
List<Integer> li = new ArrayList<Integer>() ;
for(int i=0;i<1000000;i++){
li.add(i) ;
}
long startTime = System.currentTimeMillis() ;
for(int i=0;i<1000000;i++){
li.get(i) ; //print : 15
}
long endTime = System.currentTimeMillis() ;
System.out.println(endTime-startTime) ;
}
}
remove方法对LinkedList类的使用
a.利用iterator类
import java.util.* ;
public class ListDemo01{
public static void main(String args[]){
List<Integer> li = new LinkedList<Integer>() ;
for(int i=0;i<1000000;i++){
li.add(i) ;
}
long startTime = System.currentTimeMillis() ;
Iterator<Integer> it = li.iterator() ;
while(it.hasNext()){
if(it.next()%2==0){
it.remove() ;
}
}
long endTime = System.currentTimeMillis() ;
System.out.println(endTime-startTime) ;
}
}
b.不利用iterator的话则则需要调用get方法。则效率很低
import java.util.* ;
public class ListDemo01{
public static void main(String args[]){
List<Integer> li = new LinkedList<Integer>() ;
for(int i=0;i<1000000;i++){
li.add(i) ;
}
long startTime = System.currentTimeMillis() ;
for(int i=0;i<10000;i++){
if(li.get(i)%2==0){
li.remove(i) ;
}
}
long endTime = System.currentTimeMillis() ;
System.out.println(endTime-startTime) ;
}
}
猜你喜欢
- 利用闲余时间想自己搭建一个springboo
- 很久之前也写过一篇使用Jitpack发布Android开源库的文章,详见Android发布项目到jitpack的完整步骤近来因为工作原因,又
- iOS定位 - 普通定位(没有地图) - 反地理编码(得到具体位置),下面通过代码给大家详解,代码如下:#import <CoreLo
- 文件资源操作Spring 定义了一个 org.springframework.core.io.Resource 接口,Resource 接口
- 序言for循环语句是java循环语句中最常用的循环语句,一般用在循环次数已知的情况下使用。for循环语句的语法格式如下:java语言 for
- 对 Debug 的好奇初学 Java 时,我对 IDEA 的 Debug 非常好奇,不止是它能查看断点的上下文环境,更神奇的是我可以在断点处
- 1.封装什么是封装,谈谈自己对封装的理解,封装就是将类的信息(比如说类的属性)隐藏在类的内部,不允许外部程序直接访问。此时就要提到一个关键字
- 配置不生效的解决办法注意:如果配置不生效,则说明spring优先加载了其他配置:解决办法:添加启动参数 -Dlogging.config=c
- 一:需求当小数位很多的时候,小数位后面可能有一些多余的0并没有任何实际意义。所以在某些业务需求下可以去掉这些多余的0。例如:0.2000可以
- 本篇文章介绍selenium 操作浏览器阅读目录浏览器最大化 前进,后退, 刷新截图操作模拟鼠标操作杀掉Windows浏览器进程浏览器最大化
- 本文实例为大家分享了android实现简易计算器展示的具体代码,供大家参考,具体内容如下效果图:一、如图,首先布局计算器主页显示activi
- 前言这是该工具的github地址:https://github.com/pingfangushi/screw一、引入pom.xml依赖<
- 简介常见的4种使用线程的方法:1实现 Runnable 接口;2实现 Callable 接口;3继承 Thread 类。4匿名内部类的写法。
- 关于用户token处理到的坑当采用前后台完全分离,以微服务架构的搭建时。在搭建微服务过程中,由于每个服务都是独立的应用,这样就会造成一个统一
- 1、添加一个App.config配置文件。2、配置服务http://Lenovo-PC:80/EvisaWS/WharfService?ws
- Java读取Properties文件的方法总结  
- Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。B
- 本文实例讲述了java实现word文档转pdf并添加水印的方法。分享给大家供大家参考,具体如下:前段时间,项目需要自动生成word文档,用W
- 一、 * 概念 * 分为JDK * 和cglib * 两种方式。jdk * 是由Java内部的反射机制来实现的,cglib *
- 一.瀑布模型瀑布模型严格遵循软件生命周期各阶段的固定顺序:计划、分析、设计、编程、训试和维护,上一阶段完成后才能进入到下一阶段, 整个模型就