ArrayList源码分析笔记(jdk1.8)
1.特点:
ArrayList
是一个动态数组,它是线程不安全的,允许元素为null
可重复,插入有序
读写快,增删慢
扩容:默认容量 10,默认扩容1.5倍
建议指定容量大小,减少扩容带来的性能消耗
2.构造方法
只分析复杂的
public ArrayList(Collection<? extends E> c)
c.toArray() 在Collection接口中定义的接口方法,ArrayList中调用的是Arrays.copyOf(elementData, size)方法(注:扩容也是使用此方法,高频率方法),调用的是System.arraycopy
- public static native void arraycopy(Object src, int srcPos,
- Object dest, int destPos,
- int length);
2.add
每次 add之前,都会判断add后的容量,是否需要扩容
默认扩容倍数1.5倍,如果扩容1.5倍后小于传入的容量大小,则使用传入的容量大小,单最大不能大于Integer.MAX_VALUE;
每次扩容都会修改modCount
public boolean add(E e)
public void add(int index, E element)
- public void add(int index, E element) {
- rangeCheckForAdd(index);//越界判断 如果越界抛异常
- ensureCapacityInternal(size + 1); // Increments modCount!!
- System.arraycopy(elementData, index, elementData, index + 1,
- size - index); //将index开始的数据 向后移动一位
- elementData[index] = element;
- size++;
- }
addAll同理都需要先判断ensureCapacityInternal方法进行判断是否需要扩容,然后System.arraycopy进行数组赋值扩容
3.romove
public E remove(int index)
public boolean remove(Object o)
都是通过System.arraycopy进行数组赋值来达到效果,删除后原来,尾部元素,置空,gc
public boolean removeAll(Collection<?> c)
通过循环,和w标记,保存两个集合的非共有元素,共有元素置为null,gc
- private boolean batchRemove(Collection<?> c, boolean complement) {
- final Object[] elementData = this.elementData;
- int r = 0, w = 0;
- boolean modified = false;
- try {
- for (; r < size; r++)
- if (c.contains(elementData[r]) == complement)
- elementData[w++] = elementData[r];
- } finally {
- // Preserve behavioral compatibility with AbstractCollection,
- // even if c.contains() throws.
- if (r != size) {
- System.arraycopy(elementData, r,
- elementData, w,
- size - r);
- w += size - r;
- }
- if (w != size) {
- // clear to let GC do its work
- for (int i = w; i < size; i++)
- elementData[i] = null;
- modCount += size - w;
- size = w;
- modified = true;
- }
- }
- return modified;
- }
4.set和get
modCount不会改变,效率高
5.迭代器
public Iterator<E> iterator() { return new Itr(); }
内部类:private class Itr implements Iterator<E>
modCount != expectedModCount会抛出并发修改异常ConcurrentModificationException
先next,再remove(实质上是删除上一次next的元素),否则回报IllegalStateException异常
6.与Vector区别
Vector:线程安全,都在方法上加synchronized关键字
扩容:默认容量10,默认2倍扩容
- int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
- capacityIncrement : oldCapacity);
https://blog.csdn.net/zxt0601/article/list/2
https://blog.csdn.net/ljcITworld/article/details/52041836
ArrayList源码分析笔记(jdk1.8)的更多相关文章
- ArrayList源码分析笔记
ArrayList源码分析笔记 先贴出ArrayList一些属性 public class ArrayList<E> extends AbstractList<E> imple ...
- ArrayList 源码分析(JDK1.8)
ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAccess ...
- ArrayList源码分析(JDK1.8)
概述 ArrayList底层是基于数组实现的,并且支持动态扩容的动态数组(变长的集合类).ArrayList允许空值和重复的元素,当向ArrayList中添加元素数量大于其底层数组容量时,会通过扩容机 ...
- ArrayList 源码分析 基于jdk1.8:
1:数据结构: transient Object[] elementData; //说明内部维护的数据结构是一个Object[] 数组 成员属性: private static final int ...
- ArrayList源码分析--jdk1.8
ArrayList概述 1. ArrayList是可以动态扩容和动态删除冗余容量的索引序列,基于数组实现的集合. 2. ArrayList支持随机访问.克隆.序列化,元素有序且可以重复. 3. ...
- ArrayList源码解读(jdk1.8)
概要 上一章,我们学习了Collection的架构.这一章开始,我们对Collection的具体实现类进行讲解:首先,讲解List,而List中ArrayList又最为常用.因此,本章我们讲解Arra ...
- java集合系列之ArrayList源码分析
java集合系列之ArrayList源码分析(基于jdk1.8) ArrayList简介 ArrayList时List接口的一个非常重要的实现子类,它的底层是通过动态数组实现的,因此它具备查询速度快, ...
- zeromq源码分析笔记之线程间收发命令(2)
在zeromq源码分析笔记之架构说到了zmq的整体架构,可以看到线程间通信包括两类,一类是用于收发命令,告知对象该调用什么方法去做什么事情,命令的结构由command_t结构体确定:另一类是socke ...
- Java集合干货——ArrayList源码分析
ArrayList源码分析 前言 在之前的文章中我们提到过ArrayList,ArrayList可以说是每一个学java的人使用最多最熟练的集合了,但是知其然不知其所以然.关于ArrayList的具体 ...
随机推荐
- 【洛谷P1248】加工生产调度
题目大意:某工厂收到了n个产品的订单,这n个产品分别在A.B两个车间加工,并且必须先在A车间加工后才可以到B车间加工.某个产品i在A.B两车间加工的时间分别为Ai.Bi.怎样安排这n个产品的加工顺序, ...
- win+R快捷启动程序
win10: Win+R cmd:命令行程序 notepad:记事本 winword:word文档 calc:记事本 mspaint:画图 wordpad:写字板
- spring对事务的配置
接下来我将给大家介绍spring事务配置的两种方式: 1.基于XML的事务配置.2.基于注解方式的事务配置. 前言:在我们详细介绍spring的两种声明式事务管理之前,我们需要先理解这些概念 1)sp ...
- 无法SSH服务器的解决过程(openssh-daemon is stopped)
公司某台服务器不知为何无法ssh连接上,进入现场查看: 1.执行netstat -atnlp|grep ssh,没有找到ssh端口 2.执行ps aux|grep ssh,没找到相关进程 3.执行se ...
- Linux 防火墙iptables开放特定端口
1.查看状态:iptables -L -n2.直接编辑:vi /etc/sysconfig/iptables3.端口开放:-A INPUT -m state --state NEW -m tcp -p ...
- 泛型List小项目
页面设计: 显示图书列表运行效果: 添加集合元素运行效果: 插入集合元素运行效果: 删除选中对象: 项目我已经上传到我的百度云盘,下载链接:http://pan.baidu.com/s/1mi3BjY ...
- POJ1185 状压dp(二进制//三进制)解法
很显然这是一道状压dp的题目 由于每个最优子结构和前两行有关,一个显而易见的想法是用三维dp[i][j][k]用来记录在第i行下为j状态,i - 1行为k状态时的最大值,然而dp[100][1 < ...
- JavaScript模板代码总结
//中文input框对非中文的校验 var reg=/[^\u4E00-\u9FA5]/g; if (reg.test($("#jgqc").val())){ alert(&quo ...
- Scala进阶之路-Scala中的高级类型
Scala进阶之路-Scala中的高级类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类型(Type)与类(Class)的区别 在Java里,一直到jdk1.5之前,我们说 ...
- javascript 体验倒计时:距离国庆还有多长时间
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...