糖糖儿糖儿小迷迷合集111.8G收藏补百度增加ED2K
标题:糖糖儿糖儿小迷迷合集111.8G收藏补百度增加ED2K 糖糖儿是一个在网络上颇具人气的内容创作者...
2025-10-01
一、概述
对于Java开发而言,使用集合那是家常便饭的事情,这其中ArrayList可能是使用比较多了,用起来也是相当的简单,通常就是new一个ArrayList,然后往里面添加元素,但是你真的了解往里面添加元素的时候,其内部发生了什么吗?

二、源码解读
1、相关的内部参数DEFAULT_CAPACITY:默认初始容量EMPTY_ELEMENTDATA:空实例对象的默认数组DEFAULTCAPACITY_EMPTY_ELEMENTDATA:与EMPTY_ELEMENTDATA类似,主要用于区分在首次添加元素时判断如何进行扩容elementData:ArrayList中实际存储元素的Object数组size:ArrayList中实际包含的元素数量
2、构造函数
ArrayList()
执行第一行代码的时候,有如下操作:
就是将ArrayList的elementData引用指向内置的默认对象数组。
public ArrayList(int initialCapacity)
3、add方法解析
add(E, e)
我们首先来看下这个方法
我们先跳过第一行代码,看第二行,它执行的是将elementData数组中size++位置的元素指定为传入的参数,在最开始我们就知道,size是数组的实际大小,这就非常好理解了,它执行了size++后,那elementData[size]++这个位置就是数组中的最后一个位置了,因此也就有了添加在最末尾的效果,添加成功后,第三行返回true,这没什么好说的,重点来看下第一行,ensureCapacityInternal这个方法,代码如下:
private void ensureCapacityInternal(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); }首先,判断elementData存的是否是空数组,如果是,则需要的容量就是默认容量,也就是10,接下来就执行ensureExplicitCapacity,来判断是否需要扩容。我们来看下这个方法:
private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code 注意这个注释 if (minCapacity - elementData.length > 0) grow(minCapacity); }很明显,grow方法就是那个扩容方法,什么时候执行呢?就是当需要的最小容量比现在存得数组的长度大的时候,需要进行扩容。这个有地方需要思考下,就是minCapacity – elementData.length > 0是不是能换成minCapacity > elementData.length这种写法呢?
我们再来看下grow方法:
private void grow(int minCapacity) { // overflow-conscious code 又看见这个注释了 int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }这边先获取既存数组的容量,让后将这个值扩大1.5倍得到新的容量值,(oldCapacity >> 1这个右移一位就是除以2),然后再判断扩大后的容量是不是小于需要的最小容量,是的话,将最小容量赋值给新的容量值,不然的话判断新的容量值是否大于MAX_ARRAY_SIZE这个值,是的话,将hugeCapacity的返回值赋给新的容量值,我们来看下hugeCapacity方法:
private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; }这边可以看出来,如果需要的最小容量小于0,抛出异常,否则如果需要的最小容量大于MAX_ARRAY_SIZE,则取Integer.MAX_VALUE,否则取MAX_ARRAY_SIZE。
这个就是arrayList执行Add的过程,如果通过无参构造的话,初始数组容量为0,当真正对数组进行添加时,才真正分配容量。每次按照1.5倍(位运算)的比率通过copeOf的方式扩容。
以上内容就是为大家推荐的java数组增加元素的方法(用java写数组并循环输入数据)最佳回答,如果还想搜索其他问题,请收藏本网站或点击搜索更多问题
内容来源于网络仅供参考版权声明:所有来源标注为小樱知识网www.xiaoyin02.com的内容版权均为本站所有,若您需要引用、转载,只需要注明来源及原文链接即可。
本文标题:java数组增加元素的方法(用java写数组并循环输入数据)
本文地址:https://www.xiaoyin02.com/shcs/117829.html
相关文章
热点文章
2021年独生子女补贴新政策是真的吗(独生子女证有有效期吗)
2021年国庆节阅兵仪式几点开始几点结束(2021年国庆节还有阅兵吗)
鼠目寸光一点红是什么生肖动物(鼠目寸光一点红)指什么生肖,紧密
k0到k9的玩法大全(强制gc的玩法和注意事项)
入土为安是什么生肖《入土为安》打一个生肖动物,词语解释
浙江12月底全面停工是真的吗(浙江什么时候放假停工)
如何做t(t怎么把p做哭)
北京口碑最差的三甲医院(北京301医院最擅长什么)