java基础之ArrayList的那些事

注意:本文内容基于JDK11,不同版本会有差异

1|0ArrayList的结构

ArrayList的本质上是个数组,他的底层实现都是对数组的操作。它所操作的数组就是elementData.
在这里插入图片描述

2|0源码解析

源码解析以add方法作为入口,对ArrayList进行解析

/** * * @param e 要附加到列表末尾的元素 * @return */ public boolean add(E e){ modCount++; add(e, elementData, size); return true; } /** * 数组添加元素,并且判断是否需要重新扩容 */ private void add(E e, Object[] elementData, int s){ //根据s与数组length大小的比较,如果相等才需要进入到grow方法 //而不是每次添加元素都需要进行扩容 if(s == elementData.length){ elementData = grow(); } elementData[s] = e; size = s + 1; } private Object[] grow(){ return grow(size + 1); } /** * 增加容量以确保它至少可以容纳最小容量参数指定的元素数量。 * 说白了就是扩容 * @param minCapacity 最小的容量 * @return */ private Object[] grow(int minCapacity){ //重新计算数组容量的大小,并且根据新的大小复制一个数组 elementData = Arrays.copyOf(elementData, newCapacity(minCapacity)); return elementData; } /** * 返回至少与给定最小容量一样大的容量。如果足够,则返回当前容量增加 50%。 * 除非给定的最小容量大于 MAX_ARRAY_SIZE,否则不会返回大于 MAX_ARRAY_SIZE 的容量。 * @param minCapacity * @return */ private int newCapacity(int minCapacity){ //旧的容量 int oldCapacity = elementData.length; //新的容量为在旧的基础上扩容50% int newCapacity = oldCapacity + (oldCapacity >> 1); if(newCapacity - minCapacity <= 0){ if(elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA){ return Math.max(DEFAULT_CAPACITY, minCapacity); } //小于0,是针对于当int的最大值+1为负值的情况 if(minCapacity < 0){ throw new OutOfMemoryError(); } return minCapacity; } return (newCapacity - MAX_ARRAY_SIZE <= 0) ? newCapacity : hugeCapacity(minCapacity); } private static int hugeCapacity(int minCapacity){ if(minCapacity < 0){ throw new OutOfMemoryError(); } return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; }

__EOF__

本文作者飞翔的鲸
本文链接https://www.cnblogs.com/whaletail/p/16031323.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   whale_tail  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示