集合四课之一 List接口下,ArrayList、vector和LinkedList介绍与区别 附带速记卡

java基础 数据结构 ✅数组快但不灵活,集合灵活但有成本。 阅读详情

List接口下,ArrayList、vector和LinkedList区别

一 .体系结构图

在正式开始前,我们些梳理一下List接口下的结构图
在这里插入图片描述

有了结构概念后,我们再来慢慢趴掉List接口的衣服,看清它的内在

二.List速记卡

福利 : List速记卡
在这里插入图片描述

三. ArrayList和LinkedList介绍

ArrayList和LinkedList的概念性介绍,我不再赘述,上面的速记卡中其实已然很清楚,而俩者的介绍也一般是在对比中开展的;
ArrayList数据结构为数组,相对比较容易理解;LinkedList数据结构为双向链表结构,实现基础是类中维护Entry对象或Node节点来完成,值得推敲
具体可以看本人如下俩篇博文,很有必要
LinkedList源码解析 基于Node结构
LinkedList源码解析 基于Entry结构 以及链表介绍

以下主要从时间复杂度 和空间复杂度 俩方面做出剖析

在这里插入图片描述

情景一: 插入操作

首先一点关键的是,ArrayList的内部实现是基于基础的对象数组的,因此,它使用get方法访问列表中的任意一个元素时(random-access),它的速度要比LinkedList快。LinkedList中的get方法是按照顺序从列表的一端开始检查,直到另外一端。对LinkedList而言,访问列表中的某个指定元素没有更快的方法了。
假设我们有一个很大的列表,它里面的元素已经排好序了,这个列表可能是ArrayList类型的也可能是LinkedList类型的,现在我们对这个列表来进行二分查找(binary search),比较列表是ArrayList和LinkedList时的查询速度,看下面的程序:

package com.mangocity.test; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.Random; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collections; 
public class TestList ...{ 
     public static final int N=50000;
     public static List values;
     static...{ 
         Integer vals[]=new Integer[N];
         Random r=new Random();
         for(int i=0,currval=0;i<N;i++)...{ 
             vals=new Integer(currval); 
             currval+=r.nextInt(100)+1; 
         }
         values=Arrays.asList(vals); 
     }
     static long timeList(List lst)...{ 
         long start=System.currentTimeMillis(); 
         for(int i=0;i<N;i++)...{ 
             int index=Collections.binarySearch(lst, values.get(i)); 
             if(index!=i) 
                 System.out.println("***错误***"); 
         } 
         return System.currentTimeMillis()-start; 
     } 
     public static void main(String args[])...{ 
         System.out.println("ArrayList消耗时间:"+timeList(new ArrayList(values))); 
         System.out.println("LinkedList消耗时间:"+timeList(new LinkedList(values))); 
     } 
}

 ArrayList消耗时间:15
 LinkedList消耗时间:2596

这个结果不是固定的,但是基本上ArrayList的时间要明显小于LinkedList的时间。因此在这种情况下不宜用LinkedList。二分查找法使用的随机访问(randomaccess)策略,而LinkedList是不支持快速的随机访问的。对一个LinkedList做随机访问所消耗的时间与这个list的大小是成比例的。而相应的,在ArrayList中进行随机访问所消耗的时间是固定的。
这是否表明ArrayList总是比LinkedList性能要好呢?这并不一定,在某些情况下LinkedList的表现要优于ArrayList,有些算法在LinkedList中实现时效率更高。比方说,利用Collections.reverse方法对列表进行反转时,其性能就要好些。

情景二: 插入操作

package com.mangocity.test;
import java.util.*; 
public class ListDemo { 
     static final int N=50000; 
     static long timeList(List list){ 
     long start=System.currentTimeMillis(); 
     Object o = new Object(); 
     for(int i=0;i<N;i++) 
         list.add(0, o); 
     return System.currentTimeMillis()-start; 
     } 
     public static void main(String[] args) { 
         System.out.println("ArrayList耗时:"+timeList(new ArrayList())); 
         System.out.println("LinkedList耗时:"+timeList(new LinkedList())); 
     } 
}  


ArrayList耗时:2463
LinkedList耗时:15

当一个元素被加到ArrayList的最开端时,所有已经存在的元素都会后移,内部会new出新的数组调用Copy方法来接收新的数据,这就意味着数据移动和复制上的开销。
相反的,将一个元素加到LinkedList的最开端只是简单的为这个元素分配一个记录,然后只在修改内部Entry或Node的引用便可。
在LinkedList的开端增加一个元素的开销是固定的,而在ArrayList的开端增加一个元素的开销是与ArrayList的大小成比例的。

以面这个例子比较浅显,但为什么ArrayList和LinkedList在查询过程中差距如此大,强烈建议查看本人以下博文,通过源码来探讨根本。
切勿用普通for循环遍历LinkedList

在这里插入图片描述

在LinkedList中有一个私有的内部类,定义如下:
private static class Entry {
Object element;
Entry next;
Entry previous;
}
(或者定义的是Node节点,和Entry相似,都是双向链表结构)
每个Entry对象reference列表中的一个元素,同时还有在LinkedList中它的上一个元素和下一个元素。一个有1000个元素的LinkedList对象将有1000个链接在一起的Entry对象,每个对象都对应于列表中的一个元素。这样的话,在一个LinkedList结构中将有一个很大的空间开销,因为它要存储这1000个Entity对象的相关信息,但因为它可以使用内存中“零散”的内存空间,而且,只有新增Entry时才会创建新的对象,相对来ArrayList有优势。

ArrayList使用一个内置的数组来存储元素(存储数据有序且占用连续内存),这个数组的起始容量是10.当数组需要增长时,新的容量按如下公式获得:新容量=(旧容量*3)/2+1,也就是说每一次容量大概会增长50%。这就意味着,如果你有一个包含大量元素的ArrayList对象,那么最终将有很大的空间会被浪费掉,这个浪费是由ArrayList的工作方式本身造成的。如果没有足够的空间来存放新的元素,数组将不得不被重新进行分配以便能够增加新的元素。对数组进行重新分配,将会导致性能急剧下降。如果我们知道一个ArrayList将会有多少个元素,我们可以通过构造方法来指定容量。我们还可以通过trimToSize方法在ArrayList分配完毕之后去掉浪费掉的空间。

三. vector和Stack介绍

在理解ArrayList的基础上,再去理解vector和stack就很容易了,因为它们的实现底层都是通过可这数组来完成的,以下整理出概要,方便速记

  • vector和stack是线程安全的,因为它们的方法上有Synchrozied同步锁,ArrayList则是线程不安全的
  • stack 遵守数据先进后出原则 push()方法添加对象,pop()方法弹栈输出,输出结果

具体原码可查看外部博文,讲解很到位

Java 集合系列06之 Vector详细介绍(源码解析)和使用示例

End!
在这里插入图片描述

ArrayList和LinkedList的区别与基本使用 5.遍历集合,有三种方式可以遍历,分别是for循环、foreach循环还有迭代器遍历(下面是示例)2.ArrayList是使用的动态数组的数据结构,LinkedList使用的是双向链表的数据结构。//public void addLast(E e):将指定的元素追加到此列表的末尾。//public E removeFirst():从此列表中删除并返回第一个元素。//public E getFirst():返回此列表中的第一个元素。//public E getLast():返回此列表中的最后一个元素。 阅读详情

相关推荐

ArrayList 和LinkedList各自的特点是什么

ArrayList 和LinkedList各自的特点是什么,自己实用中的总结

List与LinkedList

List基础 概述 存在索引,是一种有序集合,存取顺序 用户可以控制每个元素的插入位置,通过索引访问元素 与Set集合不同,列表通常允许重复的元素 特点 存取有序,存取有序,有索引 特有方法 方法名 描述 void add(int index,E element) 在此集合中的指定位置插入指定的元素 E remove(int index) 删除指定索引处的元素,返回被删除的元素

JIE结弦的博客 1056

android广告SDK原理详解(附源码)

广大的开发者吃糠咽菜开发了一两款APP,获取了一些流量后自然就会想到流量变现,一般情况下大家会选择到百度联盟或者Google Admob这些广告服务提供商注册开发者账号,在自己的APP里面加上几行广告位代码,集成他们的广告SDK包。然后谋事在人,成事在天,只有每天看报表查查收益。   也有一些开发者为了能够提高自己的变现水平,同时接入了好几家的sdk,哪家出的收益高一点我就出哪家的广告,但是这

rmcgogo的博客 1万+

List和LinkedList的区别

List和LinkedList的区别

weixin_44736049的博客 1598

智能音箱麦克风阵列实战:Python实现宽带GSC波束形成(附完整代码)

本文从工程实战角度,详细介绍了如何在智能音箱中利用Python实现宽带GSC波束形成算法。文章深入解析了广义旁瓣消除器(GSC)的核心架构,包括固定波束形成、阻塞矩阵与自适应滤波路径,并提供了完整的仿真代码、关键参数(如LMS步长)调优方法,以及面向嵌入式部署的计算优化与移植考量,旨在帮助开发者构建在真实噪声环境下高效工作的语音增强系统。

opencv7vision的博客 343

施耐德 Modicon M580 ePAC 项目实战:从硬件选型到 Control Expert V15 组态

本文详细解析了施耐德 Modicon M580 ePAC 在工业自动化项目中的实战应用,从硬件选型到 Control Expert V15 组态的全流程。重点介绍了水处理站控制系统的硬件配置、网络架构设计、软件安装授权及程序框架开发,帮助工程师高效实施中大型控制系统项目。

weixin_33701617的博客 328

Java集合(二)List的常用实现类

List、ArrayList(动态数组)、LinkedList(链表)、fail-fast机制、CopyOnWriteArrayList、Vector、Stack(栈)

HK的博客 4729

浅谈声发射振动复合传感器

浅谈声发射振动复合传感器 随着全球经济和自动化工业的迅速发展,人们对设备故障特别是轴承类的故障诊断也日益重视起来了。 为满足客户对旋转仪器轴承异常的精准诊断,单一的依靠振动信号或声信号分析,是很难兼顾轴承的多种异常情况的。 为此,市面上开始着手研发出了可同时分析机械设备的振动信号和声信号的复合型传感器。 初期的复合型传感器主要有 2 种类型,下面以 A、B 来举例说明。 A 型是在被测物表面不同的 2 个位置分别放置声发射(AE)传感器和加速度(ACC)传感器,它虽能一定程度...

pxtech的博客 1152

探索Java集合框架:List、ArrayList和LinkedList详解

在Java编程领域,集合框架是不可或缺的一部分,它为我们提供了灵活的数据存储和操作方式。本文将深入探讨集合框架中的List接口以及其两个主要实现类ArrayList和LinkedList。

W256936的博客 941

头歌操作系统2.3系统调用命令ls执行的系统调用

设置版本0内核为分析对象。然后一直c直到虚拟机出现。然后一直c就是答案了。

m0_74128952的博客 1万+

NVIDIA Isaac Sim 入门教程(二)

Omniverse Isaac Sim 的工作空间非常容易自定义。调整用户界面的大小、停靠、取消停靠、添加和移除面板都非常容易。进入顶部菜单栏,单击下拉菜单最下方的窗口 > 视口 > 视口 2(现在工作区中应该会出现一个名为 "视口 2 "的新视口。如果您想创建更多的视口,请按照相机检查器扩展进行操作。单击并拖动视口 2 的顶部标题以激活停靠部件。拖放到原始视口的右侧,将两个视口并排放置。单击并向左拖动视口 2 的左侧,使视口大小相等。

机器人控制与仿真应用 6545

List总结(LinkedList, ArrayList等使用场景和性能分析)

第1部分 List概括 先回顾一下List的框架图 (01) List 是一个接口,它继承于Collection的接口。它代表着有序的队列。 (02) AbstractList 是一个抽象类,它继承于AbstractCollection。AbstractList实现List接口中除size()、get(int location)之外的函数。 (03) AbstractSequentialList 是一个抽象类,它继承于AbstractList。AbstractSequentialList 实现了

m0_68850571的博客 760

STM32F4 Flash数据的保存和读取。

STM32F4 Flash数据的保存和读取。

张一西的博客 9216

List 三兄弟用法对比:ArrayList、LinkedList、Vector 的 10 个核心 API 速查(附 JMH 基准)

连续内存 + 随机读 → ArrayList头尾插入 + 低频随机读 → LinkedList老接口兼容 + 全表锁 → Vector(已弃用)并发读写 → 下篇讲下篇预告第3篇《Set 三兄弟用法对比:HashSet、LinkedHashSet、TreeSet 去重规则与迭代顺序》——带你手写 BloomFilter,看百万级去重内存省 90%!

持续输出Java相关知识 906

CSP - 2024 普及组初赛试题及解析

CSP - 2024 普及组初赛试题及解析

QD_Jason的博客 2911

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java List 完整知识体系(Java 版,面试全覆盖)

本文全面剖析Java List集合体系,从底层源码、设计思想到生产实践,涵盖核心实现类对比、线程安全机制、遍历方式优化及工具方法应用。主要内容包括: 架构体系:List继承Collection接口,核心实现类ArrayList(动态数组)、LinkedList(双向链表)、Vector(废弃线程安全类),各自针对不同场景优化。 核心实现对比: ArrayList:随机访问O(1),尾部操作高效,但中间增删需数组移位;JDK8懒加载+1.5倍扩容优化内存 LinkedList:首尾增删O(1),无扩容开销,但

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 357

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java 面试:集合类有哪些?List、Set、Map 怎么答才不乱?

尤其是 Java 面试八股,平时写业务代码的时候感觉都懂,但真到面试被问起来,如果没有提前梳理,很容易答得又散又乱。本文用面试视角,快速梳理 Java 集合体系、常见分类、核心区别和高频追问,适合面试前快速复习。是 Java 集合框架中的一个顶层接口,它表示一组对象。这篇先不展开所有集合底层原理,先把集合体系和分类讲清楚。面试时先把分类讲清楚,再展开具体实现类的特点和区别。Java 集合是面试里非常高频的基础题,尤其是。更像一个列表,元素可以重复,并且有插入顺序。既然是元素集合,就应该具备统一的遍历能力。

LayJustDoIt的博客 403

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java集合需要记忆的部分

//仅记录需要记忆的部分 0、总体框架 1、Collection Collection是一个接口,是高度抽象的集合,包含集合的基本操作:添加、删除、清空、遍历(读取)、是否为空、获取大小等。 1.1、List是有序的队列,每一个元素都一个索引,第一个元素的索引值是0,与set不同,List允许重复的元素。注意indexof和lastindexof的不同。 1.2、set不允许重复 ...

Adam York 703

集合框架 (六)

Java集合框架是存储和操作数据的核心工具,分为单列集合Collection和双列集合Map两大体系。Collection包括List(有序可重复)、Set(无序不重复)和Queue(队列);Map存储键值对,Key唯一。常用实现类有ArrayList、LinkedList、HashSet、HashMap等,各有特点:ArrayList基于动态数组查询快,LinkedList基于链表增删快,HashSet去重,HashMap键值映射高效。集合提供了丰富的API和遍历方式,支持泛型保证类型安全。开发中需注意线

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 240

《Java 100 天进阶之路》第45篇:ArrayList源码深度解析(2026版):从懒加载到1.5倍扩容奥秘

摘要:从JDK 7到JDK 8+,从懒加载到1.5倍扩容,从transient序列化到fail-fast机制,本文深入剖析ArrayList底层源码与设计思想。涵盖构造方法版本差异、扩容边界、迭代器对比、业务场景踩坑,附完整代码验证与面试真题。一篇吃透Java最常用集合框架,面试不再怕“ArrayList原理”。全文无废话,直接上干货。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 601

Java 面试核心知识点速查手册

Java 面试核心知识点速查手册

jjb1314的博客 263

Java集合--List(ArrayList、LinkedList)

ArrayList和LinkedList是Java中两种常用的List实现类。它们之间的主要区别如下: 内部实现:ArrayList是动态数组实现,底层使用数组来存储元素。LinkedList是链表实现,底层使用双向链表来存储元素。 随机访问:对于随机index访问的get和set方法,一般ArrayList的速度要优于LinkedList。 插入和删除操作:对于插入和删除操作,LinkedList优于ArrayList。 内存占用:LinkedList比ArrayList更占内存,因为LinkedLis

喜之郎cc果冻的博客 1294

Java基础(34)List集合:ArrayList和LinkedList类的用法及区别

List 是一个有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List 集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。List 集合默认按元素的添加顺序设置元素的索引,第一个添加到 List 集合中的元素的索引为 0,第二个为 1,依此类推List 实现了 Collection 接口,它主要有两个常用的实现类:ArrayList 类和 LinkedList 类。

qq_43079001的博客 746

List和LinkedList

文章目录ListList常用方法addremovesetList遍历LinkedList常用方法添加方法删除方法get List 1. 有序集合,也就是输出顺序和存入顺序相同 2. 有索引 3. 允许存储重复元素 List常用方法 add void add(int index, E element) 将指定的元素插入此列表中的指定位置(可选操作)。 List<String> list = new ArrayList<>(); list.add("a"); list.add("

weixin_43525185的博客 498

java集合

List 有序(输出的顺序与添加的顺序一致)、元素可以重复 ArrayList:查找速度快 LinkedList:添加删除速度快

weixin_45567815的博客 152

List集合(包括ArrayList和LinkedList)了解和使用

本文总结了Java集合框架中ArrayList和LinkedList的基本特性及使用方法。作者通过学习认识到集合比数组更实用,但基础仍需加强。文章详细介绍了ArrayList的数组结构特点(查询快、增删慢)及其常用方法(remove、set、get等),并通过一个学生管理系统案例进行演示。同时对比了LinkedList的链表结构(查询慢、增删快),说明其特有方法(getFirst/getLast)和三种遍历方式。最后作者表示希望获得改进建议,展现了对知识提升的积极态度。全文以实践为导向,结合具体代码示例讲解

shaadnglvsada的博客 193
上一篇: 设计模式 之 装饰器模式
下一篇: To Java程序员:切勿用普通for循环遍历LinkedList
fedrefdrrhthg
博客等级 码龄9年 63粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值