集合-ArrayList源码分析(面试)

news/2024/10/17 21:21:52/

系列文章目录

1.集合-Collection-CSDN博客​​​​​​

2.集合-List集合-CSDN博客

3.集合-ArrayList源码分析(面试)_喜欢吃animal milk的博客-CSDN博客


目录

系列文章目录

前言

一 . 什么是ArrayList?

二 . ArrayList集合底层原理

总结


前言

大家好,今天给大家讲一下ArrayList底层的扩容机制


一 . 什么是ArrayList?

ArrayList 是 List 接口的实现类之一,它是基于动态数组实现的,可以根据需要自动调整大小。ArrayList 具有以下特点:

  1. 有序性:ArrayList 中的元素是有序的,可以根据插入的顺序进行访问和操作。
  2. 可重复性:ArrayList 允许存储重复的元素。
  3. 动态调整大小:ArrayList 内部使用数组来存储元素,当元素数量超过当前数组容量时,ArrayList 会自动进行扩容,以容纳更多的元素。
  4. 随机访问:由于 ArrayList 使用数组来存储元素,因此可以通过索引来直接访问元素,具有较快的随机访问速度。
  5. 线程不安全:ArrayList 不是线程安全的,如果在多个线程同时对 ArrayList 进行修改操作,可能会导致不可预期的结果。

拓展: ArrayList和vector的区别

本质上两者没什么区别,不同的是vector是线程安全的,Arraylist是线程不安全的,两者在扩容时,扩容的空间不同,其余的两者完全一致,只不过vector使用的很少,了解即可

在ArrayList中我们没有额外的方法需要学习,它的方法直接继承自List接口


二 . ArrayList集合底层原理

public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc");
}

上面代码中利用无参构造方法创建ArrayList的对象,底层会创建一个默认长度为零的数组element

 在添加第一个元素的时候,size==emlment.length==0 会调用扩容方法grow

 说到这了,给大家解释一下size

 私有化成员变量,没有初始化,默认值为0

size有两个含义: 1. 表示当前数组中元素的个数 2. 表示下一个元素的存入位置

ok 我们来看一下grow方法

如果容量不足,且不是第一次扩容

就会调用newLength方法计算扩容后的容量的大小

这个时候可能就会有人提出疑问了? 我一个一个元素的添加怎么可能会让minGrowth>prefGrowth?

其实Arraylist集合中还有一个addAll方法

ArrayList 类提供了 addAll(Collection<? extends E> c) 方法,用于将指定集合中的所有元素添加到列表的末尾。该方法的参数是一个集合,可以是 ArrayList、LinkedList 或其他实现了 Collection 接口的类的实例。

这样一来minGrowth是不是就有可能比prefGrowth大了

newlength方法返回值处的三目运算符本质上就是去判断prefLength是否越界(int的最大值),了解即可。

总结:


总结

大家好好理解,下一篇博客见。


http://www.ppmy.cn/news/1132043.html

相关文章

注解实现策略模式

注解实现策略模式 1. 使用idea创建sprignboot项目2. 创建策略接口3. 创建策略类型注解4. 创建两个具体策略类5. 策略工厂类6. 使用 1. 使用idea创建sprignboot项目 2. 创建策略接口 public interface Handler {Double callPrice(Double price);}3. 创建策略类型注解 Target(…

Java多态调用成员的特点

Java多态调用成员的特点

【并发编程】ThreadPoolExecutor任务提交与停止流程及底层实现【新手探索版】

文章目录 1. ThreadPoolExecutor任务提交2. 线程池状态[这部分是难点呀]2.1. addWorker添加worker线程2.2. 内部类Worker2.3. runWorker():执行任务2.4. getTask():获取任务2.5. processWorkerExit():worker线程退出 3.3. 关闭线程池3.3.1. shutdown方法3.3.2. shutdownNow方法…

Feign接口调用GET请求@RequestParam传参丢失

文章目录 问题现象排查解决GET加注解解决使用POST方式解决 时间戳传参失败 问题现象 项目使用的是Spring Cloud微服务&#xff0c;服务间调用使用的是Feign在一次服务调用时&#xff0c;发现GET传参丢失&#xff0c;没有传递过去任何参数加了RequestParam注解&#xff0c;发现…

ORA-01034: ORACLE not available?一文解决

1.情况描述 oracle用户sqlplus登陆数据库&#xff08;11gR2 单机asm&#xff09;&#xff0c;进去查询一些基本的视图发现报错 ORA-01034: ORACLE not available&#xff0c;详细如下 [oracleoomcserver db_1]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production…

Unity把UGUI再World模式下显示到相机最前方

Unity把UGUI再World模式下显示到相机最前方 通过脚本修改Shader 再VR里有时候要把3D的UI显示到相机最前方&#xff0c;加个UI相机会坏事&#xff0c;可以通过修改unity_GUIZTestMode来解决。 测试用例 测试用例如下&#xff1a; 场景包含一个红色的盒子&#xff0c;一个UI…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— Web APIs(三)

思维导图 全选案例 大按钮控制小按钮 小按钮控制大按钮 css伪类选择器checked <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><…

【C++】vector的介绍 | 常见接口的使用

目录 vector的介绍 常见接口 构造函数 尾插push_back() vector的遍历 1.用方括号下标 遍历&#xff1a; 2.调用at()来访问&#xff1a; 3.用迭代器遍历&#xff1a; 4.范围for遍历&#xff1a; vector的空间修改 vector增删查改 覆盖assign() 查找find() 插入ins…