首页 > 其他分享 >ArrayList的扩容机制以及ArrayList与LinkedList的区别

ArrayList的扩容机制以及ArrayList与LinkedList的区别

时间:2024-03-21 21:22:24浏览次数:18  
标签:扩容 缓存 capacity LinkedList ArrayList 复杂度

ArrayList的扩容机制

假设采用无参构造器来实列化ArrayList对象

ArrayList arrayList = new ArrayList();

此时,arrayList的初始容量为零,当第一次调用add方法时,会触发扩容机制,容量扩容为10。
此后,在调用add方法时,如果容量不足,则容量会扩容为当前容量的1.5倍。

capcity = capacity + (capacity >> 1); 

如果在调用addAll方法时需要扩容,假设最终数组的长度为len,那么:

capacity = max(capacity + (capacity >> 1), len);

之所以这样设计,是防止采用之前的扩容机制会多次扩容。

ArrayList与LinkedList的区别

  • 底层实现上:
    ArrayList底层实现是数组, LinkedList底层实现是双向链表
  • 随机查询效率上:
    ArrayList随机查询时间复杂度为O(1), LinkedList随机查询平均复杂度为O(n)
  • 增删效率上:
    • ArrayList尾部增加元素,如果不发生扩容,时间复杂度为O(1),如果发生扩容,则时间复杂度为O(n),
      尾部删除元素时间复杂度为O(1),其余位置索引值越小,时间复杂度越高
    • LinkedList首尾增删时间复杂度为O(1),其余位置平均时间复杂度为O(n)
  • cpu缓存利用上:
    ArrayList底层是数组,所以其在内存上是一块连续的内存区域,因为cpu缓存利用了局部性原理,
    所以ArrayList的缓存命中率比较高,相反LinkedList的内存空间是不连续的,所以缓存命中率较低。

标签:扩容,缓存,capacity,LinkedList,ArrayList,复杂度
From: https://www.cnblogs.com/ydw333/p/18088277

相关文章

  • liunx磁盘分区扩容实操
    一、现状,假设虚拟机其中有一个磁盘分区使用率已经达到96%,根据需求在不影响这个磁盘分区的资料进行扩容。1、查看磁盘sdb1起始柱面,sdb1分区Start开始___2048  end结束___10485759 记录好Start初始值fdisk-l2、先在虚拟机上扩容,从5G扩容到10G 3、在liunx卸载这个......
  • 系统盘扩容01-安装统信UOS桌面操作系统1060启用系统扩容
    原文链接:系统盘扩容01-安装统信UOS桌面操作系统1060启用系统扩容Hello,大家好啊!今天,我非常高兴地为大家开启一个新的系列文章——在统信UOS上扩容系统盘。随着我们对电脑的日常使用,系统盘的空间往往会逐渐变得不够用,特别是在安装了大量软件或数据积累后。为了改善这一状况,扩......
  • 重载自增++运算符预算符完成数组扩容
    今天突发奇想,我们平时的++运算符基本都只能自增数字,那我能不能实现一个当用户自增数组时也能完成数组增加一项呢(假设你不会使用c++的变长数组或者vector!)下面就是我的实现方法,各位大佬多多指教哦!比如说gyf大佬和yzs大佬以及lxb大佬?//重载++运算符扩容数组#include<......
  • C# ArrayList、HashSet、HashTable、List、Dictionary的区别
    在C#中,数组由于是固定长度的,所以常常不能满足我们开发的需求。由于这种限制不方便,所以出现了ArrayList。ArrayList、List<T>ArrayList是可变长数组,你可以将任意多的数据Add到ArrayList里面。其内部维护的数组,当长度不足时,会自动扩容为原来的两倍。但是ArrayList也有一个缺点,......
  • openGauss的扩容缩容和问题处理
    openGauss的扩容缩容和问题处理openGauss提供了优秀的集群管理工具gs_om,集群管理信息写在二进制文件中,从而牺牲了增加节点和摘除节点的便利性(相对PG而言)。好在openGauss-1.1.0提供了节点扩容和缩容的工具,gs_dropnode和gs_expansion。生产主库服务器出现硬件故障,无法启......
  • LinkedList源码解析和设计思路
    一、继承体系LinkedList类位于java.util包中,它实现了List接口和Deque接口,LinkedList可以被当做链表、双端队列使用,并且继承自AbstractSequentialList类。在继承关系中,它的父类是AbstractSequentialList,而AbstractSequentialList又继承自AbstractList,AbstractList继承自Abs......
  • 数据结构ArrayList之杨辉三角庖丁解牛!
    题外话先给大家露一手我对杨辉三角的理解,虽说标题是庖丁解牛,但是还是虚心请教一下大家,有什么意见都可以提出!正题思维逻辑先画个杨辉三角,有几点需要大家注意一下1.杨辉三角其实在代码里就是一个二维数组,图中i代表行但是是从0开始的,而j则代表每行的元素2.如果想......
  • 数据结构之LinkedList底层代码全方位细节实现!
    题外话我很想发点nb的知识,但是路得一步一步走,饭也得一点一点吃,所以说不积跬步无以至千里,不积小流无以成江海!!!大家一起努力,未来属于我们!!正题理解链表相信大家看到这都应该明白链表,那就简单讲下链表组成今天实现LinkedList底层,LinkedList是一个双向链表,但是咱......
  • java集合框架——List集合概述及ArrayList,LinkedList的区别
    前言:List系列集合是Collection集合中两个系列的其中一个,整理下笔记。打好基础,daydayup!需要了解Collection的,可以看这篇java集合框架——Collection集合概述  List系列集合List系列集合的特点为添加的元素有序,可重复,有索引。在继承了Collection方法的基础上,有很多索引......
  • 数组扩容golang
    packagemainimport( "fmt" "unsafe")funcmain(){ which:=make([]byte,0) which=append(which,[]byte("123")...) which1:=which fmt.Printf("which:%s varpointer:%p arrpointer%p cap:%d len:%d, w......