ArrayList是JDK提供的一个数组list,其实现基于java的数组, elementData是声明在该类里面的实际保存数组的变量:
private transient Object[] elementData;
删除:
remove的时候,需要遍历整个数组,找到匹配的元素, 然后调用内部私有方法,进行快速删除(fastRemove),这个删除方法不检查数组下标长度等。
public boolean remove(Object o) { if (o == null) { for (int index = 0; index < size; index++) if (elementData[index] == null) { fastRemove(index); return true; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); return true; } } return false; }
删除的方式是调用系统类的arraycopy方法对数组本身进行自复制,也可以说是自覆盖,从找到元素的后一个index开始复制(index+1),
private void fastRemove(int index) { modCount++; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // Let gc do its work }
其实就是把该index后从index+1开始的数组全部覆盖到从index开始的位置,等于将整个数组左移了一位,所有移动的数量是numMoved。 然后再将数组最后一位清空。
填加:
public boolean add(E e) { ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
可以看到在填加元素时,首先检查是否需要对数组扩容,如果没问题,则将元素加入到目前数组的size++的位置,既加入到ArrayList的末尾。size是类级变量,java中int初始化给了默认值0。
检查容量的源码为:
public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } }
比较时检查数组目前长度与传入的所需size,如果长度不够,则做扩容,扩容用目前长度的1.5倍来计算。 这里源码中还额外计算了最小容量与新容量的大小,使增加后的数组长度能到一个合理的大小。
新的数组数据用Arrays.copyOf方法进行克隆。 该方法还可以在程序员可以预估List大小时设定List的容量,减少其内部数组elementData的扩容次数。
List的特性与数组类似,内部实现也依赖于数组,并提供了更方便的方法,如增删时越界检查及自动扩容等,是JDK加强数组使用便利性的一种封装。
相关推荐
JDK8的ArrayList源码文件
ArrayList最新源码,基于Jdk1.8
ArrayList的源码,写了一些自己的分析,包括jdk1.8的新特性
基于jdk1.8 的ArrayList的源码分析 前言:一说到ArrayList的大家可能立马想到的就是:有序、可重复、查找快但是增删慢、线程不安全。但是具体的原因都不是很清楚,本文就会根据这些问题和大家一起去学习。主要会从...
jdk源码阅读一:ArrayList
这是我从JDK中拿出的Arraylist,Vector,LinkedList源码,自己看源码的时候弄出来的,并写了一点自己的分析,仅供源码分析者使用
源码解析jdk7.0集合:ArrayList的底层实现原理.pdf
手写精简版List和ArrayList,适合新手入门学习jdk源码demo,初学易懂
NULL 博文链接:https://tianjun309.iteye.com/blog/854367
jdk源码学习 JavaSourceLearn 版本号 版本 corretto-1.8.0_275 方式 逐步阅读源码添加注释、notes文件夹添加笔记 计划学习任务计划 标题为包名,后面序号为优先级1-4,优先级递减 java.lang Object 1 String 1 ...
java.util包中的ArrayList很常用,参考jdk源码中的ArrayList.java,写了一个c版的ArrayList,目前仅坚持 char *(字符串) 和 int (整型).
jdk源码解析 :open_book: 程序猿探险记 Kong子:“学而不思则罔,思而不学则殆。” :memo: 目录 Java基础 Java如何将一个Java对象序列化到文件里 静态代理与动态代理 | 初始进洞(上) 静态代理与动态代理 | 初识...
JDK-s-source-parser ## Java的JDK原始解析###完成部分Collection / ArrayList.java由:me 2016-3-31 Collection / LinkedList.java发布者:CBQ 2016-4-4
ArrayList Jdk1.8采用的是数组的数据结构,是非线程安全的一个集合 (多线程下数据不安全),本文章主要讲解ArrayList集合添加和集合扩容,其他方法都相对简单,读懂这个后相信你翻翻源码即可读懂其他方法原理,下面...
Java源码篇之容器类——ArrayList1、前言2、ArrayList的类关系3、...对于平常开发的时候遇到的ArrayList,在此做一个简单的源码阅读记录,JDK1.8版本。 2、ArrayList的类关系 原创文章 13获赞 15访问量 7万+ 关注
Source code analysis for Java or JDK 记录一些重要的JDK/Java相关的源码分析。 Java 集合框架 ArrayList LinkedList HashMap 参考文章:
一 前言 知识追寻者目前的系列都是基于jdk1.8进行学习分析;...二 ArrayList源码分析 2.2 空参构造方法源码分析 调试代码 public static void main(String[] args) { // 初始化长度为0 ArrayList list =
JDK1.8源码分析 相关的原始码分析结果会以注解的形式体现到原始码中 已完成部分: ReentrantLock CountDownLatch Semaphore HashMap TreeMap LinkedHashMap ConcurrentHashMap 执行器 ...