原文网址: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扩容的原理相关推荐

  1. Java之HashMap系列--HashMap扩容的原理

    原文网址:Java之HashMap系列--HashMap扩容的原理_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java的HashMap是如何扩容的. 重要大小 类 初始容量 最大容量 扩容 ...

  2. Java之List系列--ArrayList保证线程安全的方法

    原文网址:Java之List系列--ArrayList保证线程安全的方法_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java中的ArrayList.LinkedList如何进行线程安全的操作.为 ...

  3. 【Java集合学习系列】HashMap实现原理及源码分析

    HashMap特性 hashMap是基于哈希表的Map接口的非同步实现,继承自AbstractMap接口,实现了Map接口(HashTable跟HashMap很像,HashTable中的方法是线程安全 ...

  4. Java集合框架:ArrayList扩容机制解释

    1.java中ArrayList该类的定义 public class ArrayList<E> extends AbstractList<E>implements List&l ...

  5. JAVA源码系列-ArrayList

    前言 ArrayList是一个基于数组的数据结构,Java1.8版本加入了Lambda匿名内部类的新特性.而ArrayList实现了java.util.function的接口,进而为了支持Lambda ...

  6. 深入Java集合学习系列:ArrayList的实现原理

    参考文献 深入Java集合学习系列:ArrayList的实现原理 本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/20 ...

  7. Java ArrayList的实现原理详解

    ArrayList是Java List类型的集合类中最常使用的,本文基于Java1.8,对于ArrayList的实现原理做一下详细讲解. (Java1.8源码:http://docs.oracle.c ...

  8. Java集合Collection源码系列-ArrayList源码分析

    Java集合系列-ArrayList源码分析 文章目录 Java集合系列-ArrayList源码分析 前言 一.为什么想去分析ArrayList源码? 二.源码分析 1.宏观上分析List 2.方法汇 ...

  9. android动态扩容数组,ArrayList 扩容 Android Java 真的不一样

    以前学java基础的时候 看过ArrayList的扩容机制 实现原理是下面这样 当时做的笔记 ArrayList扩容机制 在jdk1.7前是 *3/2+1 在jdk1.7开始就是 old+(old&g ...

最新文章

  1. 联想杜比音效_联想小新15 2020锐龙版开售
  2. 开源 java CMS - FreeCMS2.7 移动端首页静态化
  3. Docker 容器技术 — 容器存储
  4. java中顺式和链式_Java单链表顺序和链式实现(数据结构五)
  5. 【mycat】分库分表
  6. deeplearning4j – 分布式DL开源项目
  7. SAP Cloud for Customer的产品主数据通过PI同步到CRM
  8. mysql教程目录_MySql目录(二)
  9. 干货收藏!史上最强 Tomcat 8 性能优化来啦!| 原力计划
  10. [置顶]Win2012R2的一个Bug安装群集后可能引发的软件崩溃问题及相应补丁
  11. Web前端开发神器-WebStorm
  12. Python redis安装使用教程
  13. 数据库之SQL行列转换
  14. 力扣刷题 DAY_77 贪心
  15. 国外企业电子邮箱大全,国外用邮箱哪个好?怎么注册国外邮箱?
  16. C#线程间操作无效:从不是创建控件“textbox1”的线程访问它
  17. python培训学费多少钱-天津河东区儿童学编程哪里好_学费多少钱,学什么软件...
  18. 世界地图自定义绘制结合echarts,实现点击介绍项目
  19. 如何防止U盘复制电脑文件?
  20. 无可用下载链接_经典大全合集500个街机游戏大全下载

热门文章

  1. 在windows XP运行CISCO7200路由器仿真器
  2. 不打开Excel文件直接读取数据
  3. PHP GD库 生成图片水印
  4. 原装苹果手机_苹果手机换个屏水这么深!嘉兴警方揭开“原装屏”真相
  5. ctab提取dna流程图_ctab 提取dna配方
  6. 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
  7. 四级口语计算机对话,2017大学英语四级口语场景对话练习(5)
  8. 湖北移动CM201-1-CH _S905L3B-UWE5621DS_线刷固件包
  9. 乐乎常用的html源码,LOFTER网页版登录入口
  10. 每日一“酷”之Cookie