IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Java 数据结构与算法 ArrayList扩容机制分析 -> 正文阅读

[数据结构与算法]Java 数据结构与算法 ArrayList扩容机制分析

????????JDK8中,ArayList的底层是一个数组,类型是Object类型。同时没有synchronized之类的关键字,说明它是线程不安全的。

常量?

//默认的容量大小为10
private static final int DEFAULT_CAPACITY = 10;

//EMPTY_ELEMENTDATA 空对象数组(传了参数的时候使用该数组)
private static final Object[] EMPTY_ELEMENTDATA = {};

//DEFAULTCAPACITY_EMPTY_ELEMENTDATA 缺省对象数组(没有传参数的时候使用该数组)
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

//实际中数组存放的元素的个数,默认时为0个元素
private int size;

//最大的数组大小为Integer.MAX_VALUE - 8
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

构造器

带int参数

  • 如果传入的参数是大于0的数字,那么底层数组就会创建一个Object数组;
  • 如果传入的数字是一个0(相当于没有传参)那么将?EMPTY_ELEMENTDATA 这个空的数组赋值给底层数组,没有创建大小;
  • 否则抛出异常。

不带参数

  • 将空的数组?DEFAULTCAPACITY_EMPTY_ELEMENTDATA 赋值给底层数组,仍然没有创建大小。

没有传参或参数为0的构造方法中,什么时候才会真正的创建数组呢?在第一次调用add方法的时候。

部分方法

重点的方法就是add方法。其他的方法我们看看源码就可以了。

add方法

????????add方法支持两种:第一种直接add,第二种是像数组那样在index下标add。add方法中,首先通过ensureCapacityInternal方法确定是不是要扩容。然后当前的size下标插入元素e后,让size(插入的元素个数+1)。那ensureCapacityInternal方法中发生了什么?

ensureCapacityInternal方法

? ? ? ? 假设没有传入参数或参数为0,刚分析源码得知没有创建数组,进入该方法。size表示数组的下标,在+1就是数组的大小,传入size+1是合理的。

进入该方法后,先calculateCapacity数组,在ensureExplicitCapacity刚刚的结果。

calculateCapacity方法

在该方法中,计算要初始化的大小。如果数组是个没有传参的数组,返回默认数组大小10和刚传进来的size + 1;否则返回构造的时候定义的数组大小。总体来说,这个方法用来计算数组的容量。

ensureExplicitCapacity方法

ensureExplicitCapacity方法拿到calculateCapacity方法的容量后,进行判断。如果判断的容量比数组的原来容量大,就扩容,进入grow方法。

grow方法

????????进入该方法后,先将数组的大小定义为旧的容量,新的容量就是旧的容量的1.5倍。然后进行判断。minCapacity是根据当前有多少个元素来计算的,newCapacity是直接根据数组大小来计算的。

????????如果新的容量比计算的容量小,新的容量就是计算的容量;如果新的容量超过MAX_ARRAY_SIZE(一个很大的数),就进入hugeCapacity方法。否则,直接创建一个newCapacity大小的数组,拷贝到当前的elementData数组中。

综上,我们就可以得知,在jdk8中使用ArrayList,并不是立即就创建数组,而是第一次调用add方法后才创建。

set方法

remove方法

总结

优点:

(1)根据下标遍历元素和访问元素效率较高。

(2)插入和删除元素的效率不高。

(3)根据元素的值查找元素的下标需要遍历整个元素数组,效率不高。

(4)线程不安全。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 12:25:10  更:2022-10-31 12:27:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:43:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码