当我们要 add 进第1个元素到 ArrayList 时,elementData.length 为0 (因为还是一个空的 list),因为执行了 ensureCapacityInternal() 方法 ,所以 minCapacity 此时为10。此时,minCapacity - elementData.length > 0成立,所以会进入 grow(minCapacity) 方法。

当add第2个元素时,minCapacity 为2,此时e lementData.length(容量)在添加第一个元素后扩容成 10 了

直到添加第11个元素,minCapacity(为11)比elementData.length(为10)要大。进入grow方法进行扩容。扩大成容量的1.5倍

grow() 方法

/**

* 要分配的最大数组大小

*/

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

/**

* ArrayList扩容的核心方法。

*/

private void grow(int minCapacity) {

// oldCapacity为旧容量,newCapacity为新容量

int oldCapacity = elementData.length;

//将oldCapacity 右移一位,其效果相当于oldCapacity /2,

//我们知道位运算的速度远远快于整除运算,整句运算式的结果就是将新容量更新为旧容量的1.5倍,

int newCapacity = oldCapacity + (oldCapacity >> 1);

//然后检查新容量是否大于最小需要容量,若还是小于最小需要容量,那么就把最小需要容量当作数组的新容量,

if (newCapacity - minCapacity < 0)

newCapacity = minCapacity;

// 如果新容量大于 MAX_ARRAY_SIZE,进入(执行) `hugeCapacity()` 方法来比较 minCapacity 和 MAX_ARRAY_SIZE,

//如果minCapacity大于最大容量,则新容量则为`Integer.MAX_VALUE`,否则,新容量大小则为 MAX_ARRAY_SIZE 即为 `Integer.MAX_VALUE - 8`。

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);

}

java中arraylist扩容问题_Arraylist扩容机制相关推荐

  1. java中ArrayList和LinkedList的区别

    首先来看ArrayList和LinkedList的集成类和接口的区别.// lang java public class ArrayList<E> extends AbstractList ...

  2. 关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用

    转载:http://blog.csdn.net/5iasp/article/details/37054171 谢谢博主 ======================================== ...

  3. java实现分发_关于JAVA中事件分发和监听机制实现的代码实例

    [实例简介] 关于JAVA中事件分发和监听机制实现的代码实例,绝对实用代码,有说明. [实例截图] [核心代码] JavaEventDispatch ├── bin │   └── com │   └ ...

  4. Java基础-Java中的内存分配与回收机制

    Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二. 转载于:https://www.cnblogs.com/yinzhengji ...

  5. Java 中ArrayList中的重复数据

    以下介绍五种-不同的方法去除 Java 中ArrayList中的重复数据 1.使用LinkedHashSet删除arraylist中的重复数据 LinkedHashSet是在一个ArrayList删除 ...

  6. Java中arraylist和数组的相互转换

    Java中ArrayList和数组之间的相互转换 ArrayList转为数组 数组转为ArrayList 一.ArrayList转换数组 public static void arrayListToA ...

  7. java中ArrayList与LinkedList的区别

    一.背景 面试题中经常会被面试官问到ArrayList和LinkedList的区别,下面从源码角度来对他们进行一下简单的阐述,相信会对它们有一个更全面深入的了解. 首先,ArrayList和Linke ...

  8. Java中ArrayList的使用

    ArrayList类是一个特殊的数组--动态数组.来自于System.Collections命名空间:通过添加和删除元素,就可以动态改变数组的长度. 优点: 1.支持自动改变大小 2.可以灵活的插入元 ...

  9. Java中ArrayList源码分析

    一.简介 ArrayList是一个数组队列,相当于动态数组.每个ArrayList实例都有自己的容量,该容量至少和所存储数据的个数一样大小,在每次添加数据时,它会使用ensureCapacity()保 ...

  10. Java中ArrayList和LinkedList区别

    一般大家都知道ArrayList和LinkedList的大致区别:       1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.       2.对于随机 ...

最新文章

  1. 英特尔内存革新助平安云 Redis 云服务降本增效
  2. CSP 201912-1 报数 python实现
  3. android 应用启动不了,不能断点
  4. 智力题:砝码称重问题
  5. ES6学习笔记六(Iterator和for..of)
  6. C++11的模板改进
  7. 前端学习(1657):前端系列实战课程之文字输入框实现思路
  8. Installation error: INSTALL_FAILED_NO_MATCHING_ABIS
  9. Copy-On-Write容器之一:CopyOnWriteArrayList
  10. Internet控制报文协议ICMP
  11. Luogu1894[USACO4.2] 完美的牛栏The Perfect Stall
  12. java解四元一次方程
  13. 估计值与平均值的离差平方和_各变量值与其算术平均数的离差平方之和为()
  14. eda交通灯控制器波形输入_交通灯控制器课程设计.doc
  15. 计算机打字速度在线测试,在线测试打字速度(一分钟打字速度测试)
  16. 蓝桥杯单片机备战(四)共阳数码管的静态显示
  17. python交互式程序设计导论答案-《程序员编程语言经典合集(计算机科学丛书5册套装)》epub+mobi+azw3...
  18. MongoDB被黑记录
  19. macOS 访达的显示模式(如图标大小)“用作默认”(应用到所有子文件夹)的运作逻辑
  20. 招聘ABAP开发程序员

热门文章

  1. Sql语句分页,有待优化
  2. Redux零碎知识点回顾
  3. UITextView的使用详解
  4. 【距离GDOI:136天】 后缀数组中...
  5. Solr使用初探——SolrJ的使用
  6. SQL Server schema 用法
  7. 拓端tecdat|R语言近似贝叶斯计算MCMC(ABC-MCMC)轨迹图和边缘图可视化
  8. 拓端tecdat|R语言弹性网络Elastic Net正则化惩罚回归模型交叉验证可视化
  9. 拓端tecdat|R语言使用 LOWESS技术图分析逻辑回归中的函数形式
  10. 证明n次根号下n阶乘等价于n/e