JDK1.8 ArrayList 扩容机制详解
38 浏览量
更新于2024-09-01
收藏 83KB PDF 举报
本文将深入探讨Java Development Kit (JDK) 1.8中的ArrayList类底层数组扩容机制。在JDK 1.7版本中,ArrayList采用了类似“饿汉式”的初始化策略,即在创建对象时预分配一个初始容量为10的数组,当数组已满且无法容纳新元素时,会自动扩容至原有大小的1.5倍。然而,到了JDK 1.8,ArrayList的实现方式发生了改变,它采用“懒汉式”策略,即在添加第一个元素之前不会预先分配数组,而是创建一个长度为0的数组。当首次添加元素时,会创建一个容量为10的数组,之后的扩容规则同样保持为原数组大小的1.5倍。
在ArrayList类的内部,有以下几个关键属性:
1. DEFAULT_CAPACITY(固定值10)定义了默认的数组容量,这是在没有显式提供初始容量时的基础。
2. EMPTY_ELEMENTDATA和DEFAULTCAPACITY_EMPTY_ELEMENTDATA是两个不同的空数组常量,前者用于一般情况,后者用于初始化后的第一项元素。
3. elementData是一个transient Object数组,实际存储ArrayList中的元素,体现了ArrayList底层基于数组的实现。
4. size变量记录当前ArrayList中的元素个数。
5. MAX_ARRAY_SIZE是一个静态常量,表示数组的最大容量,避免因数组过大导致OutOfMemoryError。
ArrayList的构造函数根据传入的initialCapacity参数动态设置elementData数组。如果initialCapacity大于0,则直接初始化相应大小的数组;若initialCapacity为0,意味着第一次添加元素时才会进行初始化。
当ArrayList需要扩容时,它会检查当前数组是否已满(size接近MAX_ARRAY_SIZE),然后通过以下步骤进行扩容:
1. 创建一个新的、容量为当前数组容量1.5倍的新数组。
2. 将旧数组中的所有元素复制到新数组中。
3. 将新数组赋值给elementData,更新引用。
4. 更新size字段,反映新数组的容量。
这种设计优化了空间使用,提高了性能,特别是对于频繁添加元素的场景,JDK 1.8的ArrayList提供了更高效的内存管理。了解ArrayList的底层扩容机制有助于开发者更好地理解和优化代码,尤其是在处理大量数据或性能敏感的应用中。
1354 浏览量
578 浏览量
181 浏览量
2021-05-20 上传
2467 浏览量
225 浏览量
484 浏览量
193 浏览量
127 浏览量
weixin_38719719
- 粉丝: 11
- 资源: 1013
最新资源
- Windows脚本vbs:Windowsскриптvbs-HTML格式的скриптvbs-ввыводитинформациюоспецификацииПКвHTML
- 馈线自动化终端后备电源可用性快速检测.rar
- MSCellAccessory(iPhone源代码)
- chatterbox-client
- NYC-Schools:查看纽约市学校的人口统计学与绩效之间的关系(2011年数据),以及家长,老师和学生的看法
- C#用serialPort和chart控件实现简单波形绘制
- whocandoitbetter:我在这里放我的东西
- FSW115:FSW 110类文件夹
- springboot-multi-modules-demo.zip
- Daily Sadhguru Quotes-crx插件
- DsMobile
- 图片句柄取图片字节集-易语言
- triticale:精细合成遇到数据弯曲
- CLTableWithFooterViewController(iPhone源代码)
- Tomcat+MySQL为自己的APP打造服务器(4)完结篇Demo
- opencv-3.4.5.zip