public class ArrayList<E>{
private static final int DEFAULT_CAPACITY = 10;//默认的容量是10
private static final Object[] EMPTY_ELEMENTDATA = {};//长度为空的时候的数组,不可变的
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};//默认长度的空数组
transient Object[] elementData; //使用中的临时可变化的数组
private int size;//数组中的个数
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
protected transient int modCount = 0;// public void ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];//新建一个
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;//默认是0,就把空数组复制给它
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);//参数非法异常
}
} public void ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;//空参的情况下默认0的数组赋值给它
} /*增加*/
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
} /*检查是否需要扩容*/
private void ensureCapacityInternal(int minCapacity) {
//如果数组是空数组,最小容量赋值为默认10
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
} ensureExplicitCapacity(minCapacity);
}
/*确定扩容的大小
* elementData是用来存储实际内容的数组。minExpand 是最小扩充容量。
* DEFAULTCAPACITY_EMPTY_ELEMENTDATA共享的空数组实例用于默认大小的空实例。
* 根据传入的最小需要容量minCapacity来和数组的容量长度对比,若minCapactity大于或等于数组容量,则需要进行扩容。
*
*
* */
private void ensureExplicitCapacity(int minCapacity) {
modCount++; //AbstractList.class中的值 // overflow-conscious code 检测到溢出情况下的代码
//如果最小所需容量>数组长度,就需要扩容
if (minCapacity - elementData.length > 0)
grow(minCapacity);
} /*扩容操作*/
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);//默认的相当于1.5倍?
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;//如果还是不够,就把需要的值赋值
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);//判断newCapacity大容量情况,考虑minCapacity
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
} /*大容量处理*/
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError(); //如果minCapacity小于0 ,内存溢出
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE : //如果minCapacity也大于MAX_ARRAY_SIZE
MAX_ARRAY_SIZE; //否则扩容到MAX_ARRAY_SIZE
} /* 综上所述,ArrayList相当于在没指定initialCapacity时就是会使用延迟分配对象数组空间,
当第一次插入元素时才分配10(默认)个对象空间。假如有20个数据需要添加,那么会分别在第一次的时候,
将ArrayList的容量变为10 ,之后扩容会按照1.5倍增长。也就是当添加第11个数据的时候,
Arraylist继续扩容变为10*1.5=15;当添加第16个数据时,继续扩容变为15 * 1.5 =22个
在JDK1.7中,如果通过无参构造的话,初始数组容量为0,当真正对数组进行添加时,才真正分配容量。
每次按照1.5倍(位运算)的比率通过copeOf的方式扩容。
在JKD1.6中,如果通过无参构造的话,初始数组容量为10.每次通过copeOf的方式扩容后容量为原来的1.5倍加1。
*
*/ }

最新文章

  1. Modelsim-altera 仿真 顶层原理图的解决办法
  2. Json lib集成stucts2的使用方法 抛出 NestableRuntimeException异常的解决办法
  3. JSONArray遍历
  4. golang的内存模型与new()与make()
  5. st_mode 的位定义
  6. AngularJS测试二 jasmine测试路由 控制器 过滤器 事件 服务
  7. 微信小程序实例教程(四)
  8. jsp实现上一页下一页翻页功能
  9. ArrayList——源码探究
  10. 基于Vue.js的大型报告页项目实现过程及问题总结(二)
  11. 【抱怨文】vscode对多项目支持不够友好
  12. RabbitMQ框架构建系列(二)——RabbitMQ基础知识介绍
  13. 使用smb映射到本地时 访问权限,请联系管理员错误
  14. springboot 集成swagger
  15. nodejs之mock与跨域代理的三两事
  16. 寒假作业 pta编程总结2
  17. VMware 12 安装 Windows server 2008 系统
  18. SpringBoot整合Jdbc
  19. Shell - 简明Shell入门07 - 数组(Array)
  20. [Algorithm] Deferred Acceptance Algorithm

热门文章

  1. Pytorch_01 Tensor,Autograd,构建网络
  2. 5.LNMP(Linux + Nginx + MySQL + PHP)环境安装
  3. Python 3.7 安装Twisted
  4. anu小程序快速入门
  5. dump命令详解
  6. Binder吐槽学习
  7. CSS 背景图像 填充部分元素示例
  8. python的车牌号的检测
  9. java itext替换PDF中的文本
  10. Java Web解决跨域请求