ArrayList与LinkedList分析

先看看ArrayList源码

public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
//其中有一个成员变量
private transient E[] elementData;

public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = (E[])new Object[initialCapacity];
}

/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this(10);
}


由此我们可以看出它的底层其实是用数组来维护的,而且默认数组大小为10,当我们向ArrayList添加一个对象时,此对象交由数组来指向,当添加的对象超过10时

public boolean add(E o) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = o;
return true;
}

public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
elementData = (E[])new Object[newCapacity];
System.arraycopy(oldData, 0, elementData, 0, size);
}
}



我们可以看到会生成一个新的对象数组,长度为原长度的1.5倍加上1,当再次超过重复此过程

再来看看LinkedList

public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Queue<E>, Cloneable, java.io.Serializable
{
private transient Entry<E> header = new Entry<E>(null, null, null);
private transient int size = 0;

/**
* Appends the specified element to the end of this list.
*
* @param o element to be appended to this list.
* @return <tt>true</tt> (as per the general contract of
* <tt>Collection.add</tt>).
*/
public boolean add(E o) {
addBefore(o, header);
return true;
}
private Entry<E> addBefore(E o, Entry<E> e) {
Entry<E> newEntry = new Entry<E>(o, e, e.previous);
newEntry.previous.next = newEntry;
newEntry.next.previous = newEntry;
size++;
modCount++;
return newEntry;
}

private static class Entry<E> {
E element;
Entry<E> next;
Entry<E> previous;

Entry(E element, Entry<E> next, Entry<E> previous) {
this.element = element;
this.next = next;
this.previous = previous;
}
}


很明显LinkedList的底层是用双向链表来实现的,当向LinkedList添加一个对象时候,实际上在底层生成了一个Entry对象,并将添加的对象赋给其成员变量element,然后Entry会构造前后引用,使得前后链接,简单说LinkedList维护的并不是对象本身,其实是Entry对象

从上面可以看出
ArrayList是用数组来实现,所以查询的效率要高,而LinkedList是用链表来实现,所以其插入和删除的效率要高,但是两者都不是线程安全的,所以在实际开发中都要进行同步
ArrayList 与 LinkedList 原理对比及适用场景分析! 在 Java 中,ArrayList和LinkedList都是List接口的实现类,提供了类似的接口方法,可以用于存储和操作集合中的元素。尽管这两者都实现了相同的接口,但它们的底层实现机制、性能特征以及适用场景有很大的差异。因此,在实际开发中,选择合适的数据结构至关重要。本文将通过对ArrayList和LinkedList的详细对比,分析它们在插入、删除、查询等操作中的性能差异,解析它们的底层实现机制,并通过具体的 Java 示例代码帮助大家理解其应用场景。 阅读详情

相关推荐

深入解析STM32F40x CAN控制器的配置与优化

本文深入解析STM32F40x CAN控制器的配置与优化,涵盖基础工作模式、波特率计算、筛选器配置及中断管理等关键技术。通过实战案例和代码示例,帮助开发者高效配置CAN通信,提升工业控制系统的稳定性和性能。

weixin_26834815的博客 219

集合使用注意事项

使用iterator遍历集合中的元素时候,不能修改集合中的元素,否则会引发java.util.ConcurrentModificationException异常。这是因为Iterator使用快速失败机制,一旦检测到集合中的元素被修改,将引发ConcurrentModificationException异常。      这个异常在使用多线程时尤其得注意,一个线程访问迭代器中的元素,另外一个线程修改

shizhan1881的专栏 858

Mybatis Provider注解实现批量插入

需求 借助mybatis 的provider实现一个比较通用的,批量插入数据接口。 Mapper接口 第一参数为需要批量插入的数据,第二个参数为对应实体类的class public interface BaseDao<T> { @InsertProvider(type = BaseProvider.class, method = "batchInsert") int batchInsert(@Param("lists") List<T&gt

小楼夜听雨的博客 2417

图解集合1:ArrayList

前言 这个分类中,将会写写Java中的集合。集合是Java中非常重要而且基础的内容,因为任何数据必不可少的就是该数据是如何存储的,集合的作用就是以一定的方式组织、存储数据。这里写的集合,一部分是比较常见的、一部分是不常用但是我个人平时见到过的,一些比较相似的集合(比如HashMap和Hashtable)就只讲一个,突出它们之间的区别即可。 最后,要指出一点,对于集合,我认为关注的点主要有四点:...

weixin_34092455的博客 295

【AI实践】Dify调用本地和在线模型服务

Ollama可以本地部署模型,如何集成私有数据、如何外部应用程序对接,因此需要有一个应用开发框架。ip地址需要换成自己电脑的IP地址;模型名称需要和Ollama模型名称保持一致;docker是虚拟环境的主机,Ollama部署在本地主机,无法通过本机访问。找到Ollama,配置本地Ollama已经验证的模型,如phi3。在docker页面里面,也可以看到running。docker已经安装完成的情况下。,打开dify,注册登录后。在工作区选择调用即可。

AI_Gump的博客 4854

Spring Boot 3.5.4 + LangChain4j实战:用Milvus搭建企业级RAG问答系统(附阿里百炼API配置)

本文详细介绍了如何利用Spring Boot 3.5.4、LangChain4j与Milvus构建企业级RAG问答系统。内容涵盖从架构设计、阿里百炼API安全配置、Milvus部署优化,到RAG检索、会话管理等核心实现,并提供了生产级API设计、监控集成及性能优化等实战经验,旨在帮助开发者打造高可用、可维护的Java AI应用。

weixin_29054399的博客 610

foreach遍历 java

一、foreach介绍: foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。  foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本。       foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为“foreach”语

lb08241的博客 632

[密码学实战]商密TLCP协议抓包解析与深度分析(二十九)

[密码学实战]商密TLCP协议抓包解析与深度分析(二十九)

曼岛_的博客 631

LinkedList 底层实现与 ArrayList 对比分析

LinkedList 的设计核心是 “双向链表”,它用 “牺牲随机访问效率” 换取 “高效的增删操作”,完美弥补了 ArrayList 在 “频繁增删” 场景中的不足。若以 “查询” 为主,偶尔增删(且多在尾部)→ 选 ArrayList;若以 “增删” 为主(尤其是中间位置),少查询 → 选 LinkedList。

2401_89052850的博客 1236

[系统安全] 十六.PE文件逆向基础知识(PE解析和PE编辑工具)

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系统,更加深入,也是作者的慢慢成长史。换专业确实挺难的,逆向分析也是块硬骨头,但我也试试,看看自己未来四年究竟能将它学到什么程度,漫漫长征路,偏向虎山行。享受过程,一起加油~ 作者前面介绍了三个漏洞,包括Chrome浏览器保留密码渗透解析、通过Chrome浏

杨秀璋的专栏 1万+

【滚雪球学数学建模】第1节·建模入门+三步法+案例

🎓 本文收录于 《滚雪球学数学建模》专栏,本专栏专注于从零基础出发,带你循序渐进掌握数学建模的核心方法与思维路径。通过“滚雪球式”学习法,从最简单的生活化案例到经典建模工具,再到省赛、国赛真题实战演练,逐步积累知识与技能,帮助你搭建完整的建模体系。无论你是刚接触建模的新生,还是希望提升科研与竞赛能力的学者与工程师,本专栏都将为你提供一条清晰、高效、可实操的建模成长路线,助力你快速进阶,突破难点,迈向数学建模竞赛与实际应用的更高峰 🚀!

**My Coding Family** 6412

List之ArrayList、LinkedList深入分析

一文带你搞懂List实现类ArrayList与LinkedList实现原理与区别

goat的博客 1187

Wazuh部署记录

Wazuh是一个免费的开源安全平台,统一了XDR和SIEM功能。它可以保护内部部署、虚拟化、容器化和基于云的环境中的工作负载。Wazuh帮助组织和个人保护其数据资产免受安全威胁。它被全球数千个组织广泛使用,从小型企业到大型企业。443:仪表盘界面访问端口1515:探针连接服务器端口1514:探针回传信息端口以上3个端口必须打开防火墙。

墨痕诉清风的博客 1559

ArrayList 和 LinkedList 源码分析

List 表示的就是线性表,是具有相同特性的数据元素的有限序列。它主要有两种存储结构,顺序存储和链式存储,分别对应着 ArrayList 和 LinkedList 的实现,接下来以 jdk7 代码为例,对这两种实现的核心源码进行分析。 1. ArrayList 源码分析 ArrayList 是基于数组实现的可变大小的集合,底层是一个 Object[] 数组,可存储包括 null 在内的所有元素,默...

小创编程 420

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java(LinkedList和ArrayList底层分析)

2. 这时 linkeList 的属性 first = null last = null。3. 执行 unlinkFirst, 将 f 指向的双向链表的第一个结点拿掉。remove():删除一个节点对象(默认删除第一个节点对象)4.将新的结点,加入到双向链表的最后。1. 执行 removeFirst。set():修改一个节点对象。get():得到一个节点对象。add():增加节点对象。

2301_80198260的博客 443

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ArrayList与LinkedList区别源码分析

ArrayList与LinkedList ArrayList 简介 /** * Default initial capacity. * ArrayList 默认的数组容量 */ private static final int DEFAULT_CAPACITY = 10; /** * Shared empty array in...

luyuqin0115的博客 7830

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

List中的ArrayList和LinkedList源码分析

List是在面试中经常会问的一点,在我们面试中知道的仅仅是List是单列集合Collection下的一个实现类, List的实现接口又有几个,一个是ArrayList,还有一个是LinkedList,还有Vector。这次我们就来看看这三个类的源码。 ArrayList ArrayList是我们在开发中最常用的数据存储容器,它的底层是通过数组来实现的。我们在集合里面可以存储任何类型的数据, 而且...

懿的博客 1565

ArrayList与LinkedList对比:从源码角度分析性能差异

Spring IOC 容器源码解析 BeanFactory 与 ApplicationContext 层级设计

nCFn8Ewj5的博客 1676

ArrayList和LinkedList的区别和源码分析

从源码可以看出,ArrayList想要get(int index)元素时,直接返回index位置上的元素,而LinkedList需要通过for循环进行查找,虽然LinkedList已经在查找方法上做了优化,比如index < size / 2,则从左边开始查找,反之从右边开始查找,但是还是比ArrayList要慢。ArrayList自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;//向左挪一位,index位置原来的数据已经被覆盖了。

weixin_62198635的博客 732

ArrayList vs LinkedList 特点与区别分析

在Java的集合框架中,ArrayList和LinkedList都是常用的List实现类。两者虽然都实现了List接口,但在等方面存在显著区别。本文将分析 ArrayList和 LinkedList的特点及区别。

VDsing0508的博客 922

Vector,ArrayList,Linkedlist源码分析

list接口和set集合

Cocobuhui的博客 973

集合框架08:LinkedList源码分析、ArrayList和LinkedList区别

13.16 ArrayList和LinkedList区别_哔哩哔哩_bilibili。13.15 LinkedList源码分析_哔哩哔哩_bilibili。LinkedList:无需开辟连续的空间,查询慢,增删块;ArrayList:必须开辟连续的空间,查询快,增删慢;2.ArrayList和LinkedList区别。1.LinkedList源码分析。

zhangjinajian759的博客 358

ArrayList与LinkedList的性能分析

1、 前言 经常在面试时,被问到集合的概念,集合 List、Map、Set 等底层设计以及其使用场景与注意细节。但大部分人的回答都是千篇一律,跟网上的答案一模一样,这是致命滴。其实,大家都错了,尤其是网上,更是误导大家,详细原因,且听我来分析。 2、集合 List 2.1 大家心中的 List 在广大的网友心中,List 是一个缓存数据的容器,是 JDK 为开发者提供的一种集合类型。面试时,被问到最常见的就是 ArrayList 和 LinkedList 的区别。 相信大部分...

许洪昌的博客 4158

ArrayList和LinkedList源码分析

ArrayList和LinkedList源码分析: package easyExcel; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.LinkedList; public class App { public static void main( String...

heqingzhou的博客 239

ArrayList和LinkedList源码分析比较和使用场景

ArrayList是基于动态数组实现的,这意味着它可以在需要时自动扩容,ArrayList底层是一个数组,通过一段连续的存储空间存储数据,各元素按照插入的顺序进行存储,允许出现重复的元素。由于链表没有将元素存储在连续的空间中,元素存储在单独的节 点中,然后通过引用将节点连接起来了,因此在在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。相反,如果需要频繁地进行插入和删除操作,尤其是在列表的中间进行,且不需要频繁的随机访问,那么。总结:如果主要进行随机访问操作,并且插入和删除操作较少,那么应该选择。

H___Hkk的博客 513

从源码角度分析ArrayList和LinkedList的区别

List代表一种线性表的数据结构,ArrayList则是一种顺序存储的线性表。ArrayList底层采用数组来保存每个集合的元素,LinkedList则是一种链式存储的线性表。其本质上就是一个双向链表,但它不仅实现了List接口,还是想了Deque接口。也就是说LinkedList既可以当成双向链表使用,也可以当成队列使用,还可以当成栈来适用于(Deque代表双端队列,即具有队列的特征,也具有栈的...

JasonGaoH的专栏 645
上一篇: HashMap和Hashtable分析
下一篇: equals和hashCode方法分析
lk231_java
博客等级 码龄15年 0粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值