首页 > 其他分享 >ArrayList与LinkedList的底层原理

ArrayList与LinkedList的底层原理

时间:2023-09-02 21:22:32浏览次数:33  
标签:LinkedList ArrayList 元素 链表 数组 节点 底层

ArrayList是Java中常用的List集合,它基于数组来存储和操作数据。以下是ArrayList的底层原理:

  1. 内部数组:ArrayList内部维护一个Object类型的数组来存储元素。初始时,数组的长度为0。当添加元素时,数组会根据需要自动扩容。

  2. 动态扩容:当ArrayList中的元素数量超过当前数组的容量时,ArrayList会创建一个新的更大的数组,并将原数组中的元素复制到新数组中。默认情况下,ArrayList会将数组的大小扩大为当前容量的1.5倍(即增长因子为1.5)。这样做是为了避免每次添加元素时都进行数组的扩容操作,提高性能。

  3. 访问元素:ArrayList通过索引来访问元素。由于底层数组的特性,ArrayList可以通过索引直接访问元素,时间复杂度为O(1)。这使得ArrayList在随机访问元素时效率很高。

  4. 插入和删除元素:当插入或删除元素时,ArrayList需要移动其他元素以保持数组的连续性。如果在数组的中间插入或删除元素,那么后续的元素将会向后或向前移动。这样的操作会导致时间复杂度为O(n),其中n是元素的数量。因此,在需要频繁插入和删除元素的情况下,建议使用LinkedList。

  5. 迭代器:ArrayList提供了迭代器(Iterator)来遍历集合中的元素。迭代器允许按顺序访问集合中的元素,而不需要直接访问底层数组。

 

LinkedList是Java中另一种常用的List集合,它基于链表来存储和操作数据。以下是LinkedList的底层原理:

  1. 节点:LinkedList内部定义了一个Node类作为链表的节点。每个节点包含一个数据元素和指向下一个节点的引用。

  2. 头节点和尾节点:LinkedList维护了头节点(first)和尾节点(last)。头节点是链表的第一个节点,尾节点是链表的最后一个节点。如果链表为空,头节点和尾节点都为null。

  3. 添加元素:当向LinkedList中添加元素时,会创建一个新的节点,并将其添加到链表的尾部。添加元素的时间复杂度为O(1),因为只需要修改尾节点的引用。

  4. 访问元素:由于LinkedList是基于链表的结构,访问元素时需要从头节点开始遍历链表,直到找到目标元素。因此,访问元素的时间复杂度为O(n),其中n是链表的长度。

  5. 插入和删除元素:由于LinkedList是基于链表的结构,插入和删除元素的操作比ArrayList高效。在链表中插入或删除元素时,只需要修改相应节点的引用即可,不需要像数组那样移动其他元素。因此,插入和删除元素的时间复杂度为O(1)。

  6. 迭代器:LinkedList提供了迭代器(Iterator)来遍历集合中的元素。迭代器允许按顺序访问链表中的元素,而不需要直接访问底层的节点。

标签:LinkedList,ArrayList,元素,链表,数组,节点,底层
From: https://www.cnblogs.com/hwj7/p/17674211.html

相关文章

  • hashmap与hashtable,arraylist与vector
    hashmap:key可以为null,key为null的话,就不会计算hashcode码,直接给了一个0,hashmap是2倍扩容原来的容量左移一位,线程不安全,计算下标不同,hashmap下标是高位与地位的‘&’运算hashtable:key以及value都不能为null,value为null会抛异常,hashcode值是根据key来计算的,而null没有hashcode......
  • ArrayList 源码分析
    ArrayList简介ArrayList的底层是数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加ArrayList实例的容量。这可以减少递增式再分配的数量。ArrayList继承于AbstractList,实现了List,RandomAcc......
  • ArrayList源码阅读之EMPTY_ELEMENTDATA和DEFAULTCAPACITY_EMPTY_ELEMENTDATA区别
    /***Sharedemptyarrayinstanceusedforemptyinstances.*/privatestaticfinalObject[]EMPTY_ELEMENTDATA={};/***Sharedemptyarrayinstanceusedfordefaultsizedemptyinstances.We*distinguishthisfromEMPTY_ELEMENTDATAtoknowhowmuchtoi......
  • ArrayList两个对象之间的赋值
    错误的赋值:list1=list2;这种方法只是将list2的地址赋值给了list1。原先对象会被垃圾回收机制回收掉。正确的赋值:List<String>list1=newArrayList<String>();//方法一:利用集合自带的构造方法List<String>list2=newArrayList<String>(list1);//方法二:利用克隆的方......
  • Java底层起步
    <h3style="text-align:center;">Java底层起步</h3>Java介绍什么是面向对象?例如:小戴正在做饭时,发现没酱油了,对着外面的朋友小张说,小张你去买瓶酱油,然后小张给楼下超市的小王打电话,让送了一瓶酱油上来。在上述的过程中,从面向对象的角度来讲,其强调的是谁来做这个事,而不是这个事......
  • 基础底层短信服务的设计思路
    1.短信定义模板,根据模板ID,模板内容,模板内容中的符号来替换成真实的内容来发送。可以支持动态的调整短信模板文案。2.如果接入多家短信服务供应商,根据不同的发送比例来配置选择哪家供应商的比例,可以按100来作为基准,然后根据配置大小,每次发送短信的时候,随机生成一个100以内的随机数......
  • kubeadm 安装k8s1.28.x 底层走containerd 容器
    一:k8s1.28.x的概述1.1:k8s1.28.x更新Kubernetesv1.28是2023年的第二个大版本更新,包含了46项主要的更新。而今年发布的第一个版本v1.27有近60项,所以可以看出来,在发布节奏调整后,每个Kubernetes版本中都会包含很多新的变化。其中20个增强功能正在进入Alpha......
  • 垃圾收集器ParNew&CMS与底层三色标记算法详解
    垃圾收集算法分代收集理论当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。比如在新生代中,每次收集都会有大量对象(近9......
  • 开源知识付费系统源码:顶层设计与底层逻辑的舞台
    在这个信息爆炸的时代,知识的传递和获取变得越来越便利,而知识付费成为了一种越来越受欢迎的方式。然而,要在知识付费领域取得成功,并不仅仅是提供内容,还需要考虑到底层逻辑和顶层设计。正如一个简洁的表述所示:“底层逻辑有问题,顶层设计有问题。” 在这个振奋人心的时代,兔知云课堂......
  • ArrayList和Vector及LinkedList的区别
    1.ArrayList和Vector的区别第一句话:ArrayList和Vector底层都是数组实现的,初始容量都为10;在ArrayList的底层,是通过定义一个DEFAULT_CAPACITY的常量来指定的,而Vector的底层,是直接在空参构造中,通过写死了一个this(10)来指定的;第二句话:Vector大部分方法的底层实现,都加了synchronized......