Java之List系列--ArrayList扩容的原理
原文网址:Java之List系列--ArrayList扩容的原理_IT利刃出鞘的博客-CSDN博客
简介
说明
本文介绍Java的ArrayList是如何进行扩容的。即:扩容的机制。
重要大小
类 |
初始大小 |
加载因子 |
扩容倍数 |
底层实现 |
是否线程安全 |
同步方式 |
ArrayList |
10 |
1 |
1.5倍 |
Object数组 |
线程不安全 |
无 |
Vector |
10 |
1 |
2倍 |
Object数组 |
线程安全 |
synchronized |
下边介绍ArrayList的扩容机制。
扩容机制
1. new一个ArrayList对象
直接new 一个ArrayList对象时(未指定初始容量大小)是一个空的数组,容量大小为零。
public ArrayList() {// DEFAULTCAPACITY_EMPTY_ELEMENTDATA 变量为一个空的数组 // private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
2. 调用add()方法
当第一次调用ArrayList对象的add方法时,分配容量大小
public boolean add(E e) {// size为ArrayList的实际数量大小而非容量大小,若未指定容量构建ArrayList对象,size为0ensureCapacityInternal(size + 1); // Increments modCount!!elementData[size++] = e;return true;
}
private void ensureCapacityInternal(int minCapacity) {// 如果为空数组,最小需要容量为默认容量DEFAULT_CAPACITY 也就是10 // private static final int DEFAULT_CAPACITY = 10;if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);}// 调用扩容方法ensureExplicitCapacity(minCapacity);
}private void ensureExplicitCapacity(int minCapacity) {//protected transient int modCount = 0;modCount++;// 如果需要的最小容量大于此时的容量,调用真正的扩容方法// overflow-conscious codeif (minCapacity - elementData.length > 0)grow(minCapacity);
}
3. 扩容
private void grow(int minCapacity) {// transient Object[] elementData;// overflow-conscious codeint oldCapacity = elementData.length;// 第一次扩容1.5倍int newCapacity = oldCapacity + (oldCapacity >> 1);// 还是比需要的容量小就把需要的容量作为新的容量值if (newCapacity - minCapacity < 0)newCapacity = minCapacity;// 这里主要防止1.5倍扩容导致新容量值超过数组最大容量。// 如果新的容量比数组最大容量还大,则比较需求容量和数组最大容量// 如果需求容量比数组最大容量大就取整数最大值,反之取数组最大容量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);
}/*** The maximum size of array to allocate.* Some VMs reserve some header words in an array.* Attempts to allocate larger arrays may result in* OutOfMemoryError: Requested array size exceeds VM limit*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;private static int hugeCapacity(int minCapacity) {if (minCapacity < 0) // overflowthrow new OutOfMemoryError();return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE;
}
其他网址
ArrayList扩容机制。_a1275118943的博客-CSDN博客
Java之List系列--ArrayList扩容的原理相关推荐
- Java之HashMap系列--HashMap扩容的原理
原文网址:Java之HashMap系列--HashMap扩容的原理_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java的HashMap是如何扩容的. 重要大小 类 初始容量 最大容量 扩容 ...
- Java之List系列--ArrayList保证线程安全的方法
原文网址:Java之List系列--ArrayList保证线程安全的方法_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java中的ArrayList.LinkedList如何进行线程安全的操作.为 ...
- 【Java集合学习系列】HashMap实现原理及源码分析
HashMap特性 hashMap是基于哈希表的Map接口的非同步实现,继承自AbstractMap接口,实现了Map接口(HashTable跟HashMap很像,HashTable中的方法是线程安全 ...
- Java集合框架:ArrayList扩容机制解释
1.java中ArrayList该类的定义 public class ArrayList<E> extends AbstractList<E>implements List&l ...
- JAVA源码系列-ArrayList
前言 ArrayList是一个基于数组的数据结构,Java1.8版本加入了Lambda匿名内部类的新特性.而ArrayList实现了java.util.function的接口,进而为了支持Lambda ...
- 深入Java集合学习系列:ArrayList的实现原理
参考文献 深入Java集合学习系列:ArrayList的实现原理 本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/20 ...
- Java ArrayList的实现原理详解
ArrayList是Java List类型的集合类中最常使用的,本文基于Java1.8,对于ArrayList的实现原理做一下详细讲解. (Java1.8源码:http://docs.oracle.c ...
- Java集合Collection源码系列-ArrayList源码分析
Java集合系列-ArrayList源码分析 文章目录 Java集合系列-ArrayList源码分析 前言 一.为什么想去分析ArrayList源码? 二.源码分析 1.宏观上分析List 2.方法汇 ...
- android动态扩容数组,ArrayList 扩容 Android Java 真的不一样
以前学java基础的时候 看过ArrayList的扩容机制 实现原理是下面这样 当时做的笔记 ArrayList扩容机制 在jdk1.7前是 *3/2+1 在jdk1.7开始就是 old+(old&g ...
最新文章
- 联想杜比音效_联想小新15 2020锐龙版开售
- 开源 java CMS - FreeCMS2.7 移动端首页静态化
- Docker 容器技术 — 容器存储
- java中顺式和链式_Java单链表顺序和链式实现(数据结构五)
- 【mycat】分库分表
- deeplearning4j – 分布式DL开源项目
- SAP Cloud for Customer的产品主数据通过PI同步到CRM
- mysql教程目录_MySql目录(二)
- 干货收藏!史上最强 Tomcat 8 性能优化来啦!| 原力计划
- [置顶]Win2012R2的一个Bug安装群集后可能引发的软件崩溃问题及相应补丁
- Web前端开发神器-WebStorm
- Python redis安装使用教程
- 数据库之SQL行列转换
- 力扣刷题 DAY_77 贪心
- 国外企业电子邮箱大全,国外用邮箱哪个好?怎么注册国外邮箱?
- C#线程间操作无效:从不是创建控件“textbox1”的线程访问它
- python培训学费多少钱-天津河东区儿童学编程哪里好_学费多少钱,学什么软件...
- 世界地图自定义绘制结合echarts,实现点击介绍项目
- 如何防止U盘复制电脑文件?
- 无可用下载链接_经典大全合集500个街机游戏大全下载
热门文章
- 在windows XP运行CISCO7200路由器仿真器
- 不打开Excel文件直接读取数据
- PHP GD库 生成图片水印
- 原装苹果手机_苹果手机换个屏水这么深!嘉兴警方揭开“原装屏”真相
- ctab提取dna流程图_ctab 提取dna配方
- 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
- 四级口语计算机对话,2017大学英语四级口语场景对话练习(5)
- 湖北移动CM201-1-CH _S905L3B-UWE5621DS_线刷固件包
- 乐乎常用的html源码,LOFTER网页版登录入口
- 每日一“酷”之Cookie