当前位置:首页 > 生活百科

java数组增加元素的方法(用java写数组并循环输入数据)

栏目:生活百科日期:2025-05-20浏览:0

一、概述

对于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)

如果传入的容量大小大于0,则将内置的elementData指向一个新的Object数组(数组大小为initialCapacity)如果initialCapacity值为0,则将elementData引用指向EMPTY_ELEMENTDATA这个内部Object数组。如果以上两者均不满足的话,则会抛出IllegalArgumentException并附带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写数组并循环输入数据)” 的相关文章

去角质凝胶怎么使用(平价易入手的去角质凝胶及使用步骤

珂润去角质是市面上非常火的一款产品,很多人都在使用这款去角质,那么珂润去角质多少钱?珂润去角质凝露使用注意事项是什么?珂润去角质是透明、弱酸性的去角质产品,珂润...

ca证书服务器配置(搭建ca证书服务器)

架设独立CA服务器1、打开“服务器管理器”,点击“添加角色”2、点击“下一步”3、勾选“证书服务”,点击“下一步”4、点击“下一步”5、勾选“证书颁发机构web...

企业营销策划包括哪些内容,企业策划功能及流程介绍

房地产已经进入品牌竞争时代,房地产市场的竞争已从价格竞争、概念竞争转而进入品牌竞争阶段,企业更注重对品牌的培养与利用。每一个房产用户,从意向产生,到购买,每一个...

nvidia控制面板怎么打开设置(电脑设置nvidia显卡的技巧

NVIDIA是两个流行显卡制造商之一,大家习惯性称NVIDIA显卡为N卡。许多盆友在应用N卡玩游戏的情况下全是应用的默认驱动设置,即便在游戏里将实际效果设置到最...

ipad mini发布时间顺序(ipad mini2上市价格)

智东西7月13日消息,据彭博社消息,苹果正在开发一款重新设计的iPadmini,并计划今年秋天推出。新iPadmini将采用8.4英寸显示屏,屏幕边框更窄,并取...

京东母婴生活馆加盟费多少(一览母婴加盟品牌和费用)

京东作为全球500强上榜企业,在母婴行业始终保持着强劲的增长,目前已成为中国首屈一指的奶粉和纸尿裤销售渠道,京东母婴生活馆作为京东渠道下沉的战略性项目,依托京东...

ico在线转换png(iconv格式转换软件推荐)

产生需求的原因:今天想要在网页标题的左侧添加图标,效果图如下:但是心中有这个效果图,却忘记了如何使用了?需求目标:在html网页标题栏上添加图标具体实操:1.点...

交互设计招聘网站(女生冷门又高薪的职业)

【交互设计院】强森今天为大家整理了很多个设计岗位,包含的公司有:阿里巴巴新零售、阿里巴巴中台、美团外卖、美团摩拜、滴滴代驾、网易游戏、支付宝、小米、……年前面试...

厦门创业园在哪里,创业园附近企业名单公布

福鑫宝舫阳创业园园区鸟瞰效果图。标准厂房怎么建设?园区项目怎么引入?企业引进来如何更好发展?这是各个创业园区业主和管理方一直在思考的问题。如今,在翔安巷北工业区...

产品经理深入浅出教程(实战流程及方法论)

在数年以前,产品经理这词是在传统行业的出现的,是由美国保洁公司提出,传统行业的产品经理做的更多是市场营销方面的工作。所以那时也叫品牌经理。在中国产品经理的前身是...