首页
学习
活动
专区
圈层
工具
发布

从源码上分析 ArrayList

前言 ArrayList 是 List 接口的一个实现类,那么 ArrayList 的底层是如何实现的呢?让我们来一探究竟。...其扩容原理就是创建一个容量为当前容量 1.5 倍的新数组,将旧数组的内容拷贝给新数组。...elementData[--size] = null; // clear to let GC do its work return oldValue; } 先进行有效性判断,然后从要删除的元素开始的所有元素都向前拷贝一位...总结 根据上方的源码分析,我们可以得出 ArrayList 的一些特性: ArrayList 底层数据结构是对象数组,如不指定长度,则初始容量为 10。...每次扩容为原来容量的 1.5 倍,扩容原理是将原来的数据拷贝到新数组中。 所以我们在使用时要注意: 如知道大概要存多少个数据,最好指定初始化容量,这样可以提高程序性能。

54310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    从源码读 ArrayList(一)

    今天就从最最常用的 ArrayList 说起。 概述 ArrayList 是一种可以动态增长和缩减的线性表数据结构,允许重复元素,允许 null 值。...在指定位置插入数据,就要将该位置之后的数据都往后挪,才能腾出空间。在指定位置删除数据,就要将该位置之后的数据全部往前挪,才能保证空间连续性。它们的平均时间复杂度都是 O(n)。...是一个空数组,所以当你执行 List list = new ArrayList() 时,实际上创建了一个空数组,并不是容量为 10 的数组。...initialCapacity 大小按如下规则: 大于 0 时,创建指定大小的数组 等于 0 时,使用成员变量 EMPTY_ELEMENTDATA,它是一个空数组 小于 0 时,直接抛出异常 public...方法 ArrayList 提供了插入,删除,清空,查找,遍历等基本集合操作。下面从 add() 开始,通过源码更加深刻的理解 ArrayList 的实现。

    54110

    从源码看集合ArrayList

    可能大家都知道,java中的ArrayList类,是一个泛型集合类,可以存储指定类型的数据集合,也知道可以使用get(index)方法通过索引来获取数据,或者使用for each 遍历输出集合中的内容...其实就是通过创建新的数组,将原来的数组中的内容转移到新的数组中来,实现动态扩容。...接受过传入的数据容量值,执行modCount++;增加修改次数(后文会说为什么有这个计数器),判断数据容量值是否比现数组长度大,如果数据容量值超过现有数组长度(需要扩容),执行:grow(minCapacity...自然长度为0),然后进行扩充数组容量,创建新数组返回。...如果原数组非空,将判断数据容量值是否大于现数组长度,否说明添加此新元素之后数据量长度仍然小于数组长度(数组长度足够),是就会调用grow方法创建新数组赋值elementData数组。

    89260

    Java-创建自定义ArrayList

    https://blog.csdn.net/li_xunhuan/article/details/89153496 /** * 自己实现一个ArrayList...,帮助自己更好地理解ArrayLIst类的底层结构 */ public class MyArrayList /*implements List*/ { private Object[] elementData...System.out.println(list.get(3)); list.remove(3); System.out.println(list.getSize()); } } 知识要点: 一、实际上ArrayList...类内部实现的时候还是以数组的形式存数据的;相较于数组,其类型在JDK原码中是用泛型E来定义的,我此处所写Object来描述的; 二、关乎一个动态数组的一些参数: 描述类型:Object 数组的默认大小...定点设置这一系列操作我们都是要对所要执行的位数所判断其有没有越界,这么多操作如果都进行操作合法性的判断,那么最合理的方式是用封装解决这个问题,在类里面private描述一个rangeCheck方法,只供类内部的方法所调用; 四、还有一个关键问题是ArrayList

    92120

    arraylist扩容是创建新数组吗 java_arraylist扩容机制要怎么实现?arraylist怎么扩容…「建议收藏」

    ArrayList大家都知道了吧,这是一个动态数组。以java语言来说,数组是定长的,在被创建之后就不能被加长或缩短了,因此,了解它的扩容机制对使用它尤为重要。...首先我们知道,ArrayList有着三种初始化方式: 1)指定大小初始化public ArrayList(int initialCapacity) 2)传入一个Collection对象初始化,并将对象中的数据添加到...ArrayList中public ArrayList(Collection c) 3)默认构造函数初始化public ArrayList() ArrayList扩容机制发生在add()方法调用的时候,从下面的代码我们可以看出当使用无参构造函数创建...elementData.length; // 扩容至原来的1.5倍 int newCapacity = oldCapacity + (oldCapacity >> 1); // 再判断一下新数组的容量够不够,够了就直接使用这个长度创建新数组...hugeCapacity(minCapacity); // 调用Arrays.copyOf方法将elementData数组指向新的内存空间时newCapacity的连续空间 // 并将elementData的数据复制到新的内存空间

    70910

    ArrayList 从源码角度剖析底层原理

    ensureCapacityInternal 作用为:保证在不停的往 ArrayList 插入数据时,数组不会越界,并且实现自动扩容。...remove 了解数据怎么来,接下来我们来看一下数据是怎么被移除的。...总结 所以,看完 ArrayList 的部分源码之后,我们就可以知道,ArrayList 的底层数据结构是数组。...但是从源码也看出来了,扩容、删除都是有代价的,特别是在极端的情况,会需要将大量的元素进行移位。...多线程的情况下会出现数据不一致或者会抛出 ConcurrentModificationException 异常,关于这块后面有机会再聊吧 了解完如何向一个数据结构中存取、移除数据,其实就已经能够顺理成章的理解跟其相关的很多事情了

    46220

    代码审查:从 ArrayList 说线程安全

    ---- 本文从代码审查过程中发现的一个 ArrayList 相关的「线程安全」问题出发,来剖析和理解线程安全。...,而这里会多线程改写同一个 ArrayList 对象,感觉这样的写法会有问题,于是看了下 ArrayList 的实现来确认问题,同时复习下相关知识。...elementData[size++] = e; return true; } // ... } 从中我们可以关注到关于 ArrayList 的几点信息: 使用数组存储数据...ForkJoinPool.java:1703) at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:172) 从我这里试验的情况来看...实际上除了抛出这种异常外,以上场景还可能造成数据覆盖/丢失、ArrayList 里实际存放的元素个数与 size 值不符等其它问题,感兴趣的同学可以继续挖掘一下。

    1.4K20

    ArrayList 从源码角度剖析底层原理

    ensureCapacityInternal 作用为:保证在不停的往 ArrayList 插入数据时,数组不会越界,并且实现自动扩容。...remove 了解数据怎么来,接下来我们来看一下数据是怎么被移除的。...总结 所以,看完 ArrayList 的部分源码之后,我们就可以知道,ArrayList 的底层数据结构是数组。...但是从源码也看出来了,扩容、删除都是有代价的,特别是在极端的情况,会需要将大量的元素进行移位。...多线程的情况下会出现数据不一致或者会抛出 ConcurrentModificationException 异常,关于这块后面有机会再聊吧 了解完如何向一个数据结构中存取、移除数据,其实就已经能够顺理成章的理解跟其相关的很多事情了

    39720

    firebase:一款功能强大的Firebase数据库安全漏洞与错误配置检测工具

    firebase是一款针对Firebase数据库的安全工具,该工具基于Python 3开发,可以帮助广大研究人员针对目标Firebase数据库执行安全漏洞扫描、漏洞测试和错误配置检测等任务。...,每行一个数据库名称,该选项不能跟-d或-c一起使用; --dnsdumpster:使用DNSDumpster API收集数据库信息; --just-v:忽略没有安全漏洞的数据库; --amass:amass...4个并行进程执行任务: python3 firebase.py -p 4 -f results_1.json -c 150 --dnsdumpster 生成的JSON结果文件将包含收集到的数据库安全信息以及转储的内容...,每个数据库包含一个状态数据,可能的值如下: -2:未检测到漏洞; -1:目标数据库不存在; 0:可能可以执行进一步漏洞利用; 1:检测到漏洞; 许可证协议 本项目的开发与发布遵循MIT开源许可证协议...项目地址 firebase: https://github.com/francesc-h/firebase https://github.com/PaulSec/API-dnsdumpster.com

    2.8K10

    数据结构之ArrayList

    首先:讲述ArrayList之前先来说下List,List是java重要的数据结构之一,我们经常接触到的有ArrayList、Vector和LinkedList三种,他们都继承来自java.util.Collection...从中可以大致了解集合类之间的关系 本篇主要讲述 Arraylist Arraylist初始化方法,最简短的 List strings = new ArrayList(asList...在使用ArrayList的时候,应注意ArrayList并不是线程安全的,如果需要多线程并发操作应当使用CopyOnWriteArrayList(读远大于写的情况),或者使用Collections工具类的...❤️❤️❤️2、LinkedList使用了双向链表数据结构,与基于数组实现的ArrayList和Vector相比,这是一种不同的实现方式,这也决定了他们不同的应用场景。...在大数据量频繁的调用过程中,对性能会有所影响。

    39640

    Flutter 与 Firebase 集成:认证、数据库、云存储实战

    作者:爱吃大芒果 个人主页 爱吃大芒果 本文所属专栏 Flutter 更多专栏 Ascend C 算子开发教程(进阶) 鸿蒙集成 从0到1自学C++ 前言 在移动应用开发中,用户认证、数据存储、文件上传是核心功能模块...本教程将以实战为导向,从环境准备入手,逐步实现 Flutter 与 Firebase 的集成,重点讲解用户认证(邮箱密码登录、Google 第三方登录)、实时数据库(数据增删改查)、云存储(图片上传与展示...:实现数据增删改查 Firebase Realtime Database 是一个云托管的 NoSQL 数据库,数据以 JSON 格式存储,支持实时同步,非常适合构建需要实时更新数据的应用(如聊天、社交、...3.1 启用实时数据库并配置规则 登录 Firebase 控制台,进入当前项目,点击左侧「Realtime Database」; 点击「创建数据库」,选择数据库位置(建议选择离用户最近的区域,如...= null" // 已登录用户可写入 } } 3.2 封装数据库工具类 创建 lib/services/database_service.dart 文件,封装实时数据库的增删改查操作: import

    24510

    ArrayList实现原理分析(Java源码剖析)ArrayList使用的存储的数据结构ArrayList的初始化ArrayList是如何动态增长ArrayList如何实现元素的移除ArrayList

    ArrayList使用的存储的数据结构 ArrayList的初始化 ArrayList是如何动态增长 ArrayList如何实现元素的移除 ArrayList小结 ArrayList是我们经常使用的一个数据结构...ArrayList是作为List接口的一个实现。 那么ArrayList背后使用的数据结构是什么呢? ArrayList是如何保证动态增加容量,使得能够正确添加元素的呢?...需要说明的是,本文所分析的源码引用自JDK 8版本 ArrayList使用的存储的数据结构 从源码中我们可以发现,ArrayList使用的存储的数据结构是Object的对象数组。...ArrayList的初始化 ArrayList提供了三个构造函数。...ArrayList小结 ArrayList是List接口的一个可变大小的数组的实现 ArrayList的内部是使用一个Object对象数组来存储元素的 初始化ArrayList的时候,可以指定初始化容量的大小

    2.1K30

    如何从文档创建 RAG 评估数据集

    在本文中,将展示如何创建自己的 RAG 数据集,该数据集包含任何语言的文档的上下文、问题和答案。 检索增强生成 (RAG) 1 是一种允许 LLM 访问外部知识库的技术。...创建 RAG 评估数据集 我们加载文档并将上下文传递给生成器 LLM,生成器会生成问题和答案。问题、答案和上下文是传递给 LLM 评委的一个数据样本。...自动从文档生成 RAG 评估数据样本的工作流程。图片由作者提供 自动生成 RAG 数据集的基本工作流程从从文档(例如 PDF 文件)读取我们的知识库开始。...生成问答上下文样本 使用 OpenAI 客户端和我们之前创建的模型,我们首先编写一个生成器函数来从我们的文档中创建问题和答案。...实验结论 从文档集合中自动创建 RAG 评估数据集非常简单。我们所需要的只是 LLM 生成器的提示、LLM 评委的提示,以及中间的一些 Python 代码。

    2.5K20

    【重学数据结构】数组 ArrayList

    数组是一种线性表的数据结构,是一个存储相同数据类型的集合,每个相邻元素的物理内存地址也相邻。...的时候,如果指定了容量大小的话,那它就会创建一个指定容量大小的数组;如果没指定,默认会初始化一个空的数组,等add第一个元素的时候,容量扩充为10。 ...首次创建 ArrayList 是一定会扩容的,也就是初始化 DEFAULT_CAPACITY = 10 的容量。...Arrays.copyOf 实际上是创建一个新的空间数组,之后调用的 System.arraycopy 迁移到新创建的数组上。这样后续所有的扩容操作,也就都保持统一了。...ArrayList在首次添加元素之前,底层数组是一个空数组,在首次添加元素的时候自动扩容到10。 ArrayList 中扩容的范围是多大一次?

    12610

    【Java数据结构】---List(ArrayList)

    今天先开始我们熟悉的顺序表(ArrayList)的具体内容。 线性表 之前C语言部分也学习过顺序表,我们这里就简单说明。 线性表(linear list)是n个具有相同特性的数据元素的有限序列。...线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列…(之后都会学习到) 线性表在逻辑上是线性结构,也就说是连续的一条直线。...顺序表(MyArrayList) 顺序表是**用一段物理地址连续的存储单元依次存储数据元素的线性结构**,一般情况下采用数组存储。...在数组上完成数据的增删查改 因为ArrayList是集合框架下的一个普通的类,他的增删查改可以由编译器实现。我们要做的就是自主实现这些功能,增强对代码的理解。...System.out.println(list); System.out.println(list1); } // 查找指定元素第一次出现的位置:indexOf从前往后找,lastIndexOf从后往前找

    7910
    领券