摘要:的源码分析扩容机制初始化值默认数组的初始化容量空数组元素空数组元素存储元素的数组缓冲区元素个数每次数据进行修改都会主要是在一些非线程安全的时候,检测是否出现混乱构造方法默认数组的长度为自己定义初始化的容量添加元素将元素和数组长度数
Arraylist的源码分析(扩容机制-JDK 10)
初始化值
private static final long serialVersionUID = 8683452581122892189L; 默认数组的初始化容量 private static final int DEFAULT_CAPACITY = 10; 空数组元素 private static final Object[] EMPTY_ELEMENTDATA = {}; 空数组元素 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; 存储ArrayList元素的数组缓冲区 transient Object[] elementData; // non-private to simplify nested class access 元素个数 private int size; 每次数据进行修改都会+1---主要是在一些非线程安全的时候,检测是否出现混乱 protected transient int modCount = 0;
构造方法
默认数组的长度为10
public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }
自己定义初始化的容量
public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } }
添加元素
public boolean add(E e) { modCount++; 将元素和数组长度、数组大小(元素的个数)传过去 add(e, elementData, size); return true; } private void add(E e, Object[] elementData, int s) { 如果元素的个数和数组的长度相等,那么就需要对数组进行扩容 if (s == elementData.length) elementData = grow(); 如果不是,则将元素添加到最后(元素的最后) elementData[s] = e; 并且元素个数+1 size = s + 1; }
开始扩容—扩容的方法
private Object[] grow() { 将可允许的数组的最小容量传过去(元素个数(size+1)—因为要添加一个元素) return grow(size + 1);
}
private Object[] grow(int minCapacity) { 调用复制的方法,在原来元素基础上增加容量 return elementData = Arrays.copyOf(elementData, newCapacity(minCapacity)); } private int newCapacity(int minCapacity) { // overflow-conscious code 获取数组的长度(默认的或是自己定义的) int oldCapacity = elementData.length; 新的容量是原容量的1.5倍 int newCapacity = oldCapacity + (oldCapacity >> 1); 新容量比可允许的最小容量小,那么新的容量就是可允许的最小的容量 之所以会有这个判断,是因为我们可以自己定义初始容量,而不一定是默认的容量 if (newCapacity - minCapacity <= 0) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) return Math.max(DEFAULT_CAPACITY, minCapacity); if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return minCapacity; } 如果新容量大于数值的最大值,传入huge方法, return (newCapacity - MAX_ARRAY_SIZE <= 0) ? newCapacity : hugeCapacity(minCapacity);
}
可允许的最小容量是否越界,如果新容量大于数组默认的最大值,赋给它整型的最大值
private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
}
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/73459.html
摘要:源码分析构造方法有两个构造方法,一个是无参,另一个需传入初始容量值。所以我们可以把上面的代码转换一下,等价于下面形式这个时候,我们再去分析一下的迭代器源码就能找出原因。原因是删除元素后,元素计数器,而迭代器中的也等于,从而导致返回。 1.概述 ArrayList 是一种变长的集合类,基于定长数组实现。ArrayList 允许空值和重复元素,当往 ArrayList 中添加的元素数量大于...
摘要:用户态不能干扰内核态所以指令就有两种特权指令和非特权指令不同的状态对应不同的指令。非特权指令所有程序均可直接使用。用户态常态目态执行非特权指令。 这是我今年从三月份开始,主要的大厂面试经过,有些企业面试的还没来得及整理,可能有些没有带答案就发出来了,还请各位先思考如果是你怎么回答面试官?这篇文章会持续更新,请各位持续关注,希望对你有所帮助! 面试清单 平安产险 飞猪 上汽大通 浩鲸科...
摘要:常用集合使用场景分析过年前的最后一篇,本章通过介绍,,,底层实现原理和四个集合的区别。和都是线程安全的,不同的是前者使用类,后者使用关键字。面试官会认为你是一个基础扎实,内功深厚的人才到这里常用集合使用场景分析就结束了。 Java 常用List集合使用场景分析 过年前的最后一篇,本章通过介绍ArrayList,LinkedList,Vector,CopyOnWriteArrayList...
摘要:当真正对数组进行添加元素操作时,才真正分配容量。下面在我们分析扩容时会降到这一点内容二一步一步分析扩容机制这里以无参构造函数创建的为例分析先来看方法将指定的元素追加到此列表的末尾。 该文已加入开源文档:JavaGuide(一份涵盖大部分Java程序员所需要掌握的核心知识)。地址:https://github.com/Snailclimb... 一 先从 ArrayList 的构造函数...
摘要:底层使用的是双向链表数据结构之前为循环链表,取消了循环。快速随机访问就是通过元素的序号快速获取元素对象对应于方法。而接口就是用来标识该类支持快速随机访问。仅仅是起标识作用。,中文名为双端队列。不同的是,是线程安全的,内部使用了进行同步。 前言 学习情况记录 时间:week 2 SMART子目标 :Java 容器 记录在学习Java容器 知识点中,关于List的需要重点记录的知识点。...
阅读 1630·2019-08-30 15:55
阅读 950·2019-08-30 15:44
阅读 841·2019-08-30 10:48
阅读 1995·2019-08-29 13:42
阅读 3162·2019-08-29 11:16
阅读 1161·2019-08-29 11:09
阅读 2014·2019-08-26 11:46
阅读 592·2019-08-26 11:44