public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.SerializableRandomAccess: 实现该接口可以通过下标序号快速访问
Cloneable: 能够被克隆
Serializable:这一个则是支持序列化的

View Code

成员变量

    //这个是表示默认的容量大小是10private static final int DEFAULT_CAPACITY = 10;//表示这是一个空的数组private static final Object[] EMPTY_ELEMENTDATA = {};//这个是和上面的那个又区别的,当添加第一个元素的时候会扩容private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};//是真正存储数据的地方transient Object[] elementData; // non-private to simplify nested class access//这个是数组中元素的个数private int size;

构造函数

//这个是通过给定一个具体的值(初始化长度)来进行构造,当然给定的值不能小于0,不然会抛异常
public ArrayList(int initialCapacity) {if (initialCapacity > 0) {this.elementData = new Object[initialCapacity];} else if (initialCapacity == 0) {//如果值为0,则会构造一个空的数组this.elementData = EMPTY_ELEMENTDATA;} else {throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);}}//没有参数传递的话,则默认初始化容量为10,并赋予一个空的数组DEFAULTCAPACITY_EMPTY_ELEMENTDATApublic ArrayList() {this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}//使用已有的集合c来创建一个新的ArrayList,public ArrayList(Collection<? extends E> c) {//先将集合转成数组elementData = c.toArray();//如果c里面有数据if ((size = elementData.length) != 0) {// c.toArray might (incorrectly) not return Object[] (see 6260652)//判断转换的数组是否是Object[]类型if (elementData.getClass() != Object[].class)elementData = Arrays.copyOf(elementData, size, Object[].class);} else {// c里面没有数据this.elementData = EMPTY_ELEMENTDATA;}}

修改容量大小

public void trimToSize() {modCount++;//也就是说数组中实际的个数小于数组的容量if (size < elementData.length) {elementData = (size == 0)? EMPTY_ELEMENTDATA: Arrays.copyOf(elementData, size);}}//将集合的容量增加为 minCapacitypublic void ensureCapacity(int minCapacity) {int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)// elementData 里面有数据? 0// larger than default for default empty table. It's already// supposed to be at default size.: DEFAULT_CAPACITY;  //值为10if (minCapacity > minExpand) {ensureExplicitCapacity(minCapacity);}}private void ensureCapacityInternal(int minCapacity) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);}ensureExplicitCapacity(minCapacity);}private void ensureExplicitCapacity(int minCapacity) {modCount++;// overflow-conscious codeif (minCapacity - elementData.length > 0)grow(minCapacity);}private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;// *增加容量以确保它至少可以容纳由minimum capacity参数指定的元素数量。* @param minCapacity the desired minimum capacity*/private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;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);}private static int hugeCapacity(int minCapacity) {if (minCapacity < 0) // overflowthrow new OutOfMemoryError();return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE;}

View Code

添加元素

//添加元素到末尾
public boolean add(E e) {ensureCapacityInternal(size + 1);  // Increments modCount!!elementData[size++] = e;return true;}//添加元素到指定的位置public void add(int index, E element) {//顾名思义,检查检查索引是否越界
        rangeCheckForAdd(index);ensureCapacityInternal(size + 1);  // Increments modCount!!//这个是重点System.arraycopy(elementData, index, elementData, index + 1,size - index);elementData[index] = element;size++;}    private void rangeCheckForAdd(int index) {if (index > size || index < 0)throw new IndexOutOfBoundsException(outOfBoundsMsg(index));}//将集合添加到数组里面public boolean addAll(Collection<? extends E> c) {//集合转数组Object[] a = c.toArray();int numNew = a.length;ensureCapacityInternal(size + numNew);  // Increments modCountSystem.arraycopy(a, 0, elementData, size, numNew);size += numNew;return numNew != 0;}//这个是指定要将集合插入那个位置public boolean addAll(int index, Collection<? extends E> c) {rangeCheckForAdd(index);Object[] a = c.toArray();int numNew = a.length;ensureCapacityInternal(size + numNew);  // Increments modCountint numMoved = size - index;if (numMoved > 0)System.arraycopy(elementData, index, elementData, index + numNew,numMoved);System.arraycopy(a, 0, elementData, index, numNew);size += numNew;return numNew != 0;}

View Code

删除元素

//删除指定位置的元素public E remove(int index) {rangeCheck(index);modCount++;E oldValue = elementData(index);int numMoved = size - index - 1;if (numMoved > 0)System.arraycopy(elementData, index+1, elementData, index,numMoved);elementData[--size] = null; // clear to let GC do its workreturn oldValue;}public boolean remove(Object o) {//传过来的值为nullif (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;}//这个是把集合清空,也就是将里面的值都值为nullpublic void clear() {modCount++;// clear to let GC do its workfor (int i = 0; i < size; i++)elementData[i] = null;size = 0;}//删除fromIndex到toIndex之间的全部元素protected void removeRange(int fromIndex, int toIndex) {modCount++;int numMoved = size - toIndex;System.arraycopy(elementData, toIndex, elementData, fromIndex,numMoved);// clear to let GC do its workint newSize = size - (toIndex-fromIndex);for (int i = newSize; i < size; i++) {elementData[i] = null;}size = newSize;}

View Code

  其实在查看ArrayList源码的时候你会发现里面其实叶柄灭有你想的那么复杂,在这个数组里面主要就是靠着 System.arraycopy方法来进行操作的。该数组里面默认容量的大小为10

转载于:https://www.cnblogs.com/zhuguangzhe/p/9488718.html

ArrayList(1.8)相关推荐

  1. Java List与ArrayList 的区别(List list =new Arraylist(); ArrayList<String> arrayList = new ArrayList())

    一般想知道List 与ArrayList 的区别可能大部分都是看到了 List list = new ArrayList(); 和 ArrayList arrayList = new ArrayLis ...

  2. List 为什么可以实例化ArrayList

    昨天我带的一个同事问我List 为什么可以实例化ArrayList,刚开始一下萌了(带了快 2个月了) 比如List list = new ArrayList(); List 是一个接口, 接口使用的 ...

  3. ArrayList源码学习

    可增长数组结构 实现: 1. 内部采用数组的方式. 1.1 添加元素,会每次校验容量是否满足, 扩容规则是当前数组长度+当前数组长度的二分之一.容量上限是Integer.MAX_VALUE. copy ...

  4. 比较ArrayList、LinkedList、Vector

    翻译人员: 铁锚 翻译时间: 2013年12月2日 原文链接: ArrayList vs. LinkedList vs. Vector 1. List概述 List,就如图名字所示一样,是元素的有序列 ...

  5. 3月7日 ArrayList集合

    ArrayList与数组的区别: 数组是连续的.同一类型数据的一块区域,而集合可以是不连续的.多种数据类型的. 1.ArrayList ArrayList al = new ArrayList(); ...

  6. 转 java c++互传arraylist

    Java JNI由浅入深(包括:Java和C++互传ArrayList泛型对象参数) 2010-11-25 09:57 1694人阅读 评论(1) 收藏 举报 我们知道Java是一个运行在虚拟机里面的 ...

  7. List and ArrayList

    List<> and ArrayList Class Diagrams Using the Bit Complement of the BinarySearch() Result 代码   ...

  8. java arraylist和list_Java中ArrayList和LinkedList区别

    原文链接:http://pengcqu.iteye.com/blog/502676 一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据 ...

  9. Java 集合框架(二)—— ArrayList

    二.数组列表 -- ArrayList 1.构造方法 ArrayList 是 Java 中的动态数组,底层实现就是对象数组,只不过数组的容量会根据情况来改变. 它有个带 int 类型参数的构造方法,根 ...

  10. ArrayList Iterator remove java.lang.UnsupportedOperationException

    在使用Arrays.asList()后调用add,remove这些method时出现 java.lang.UnsupportedOperationException异常.这是由于Arrays.asLi ...

最新文章

  1. keepalived mysql集群_keepalived + Mysql(主主)实现高可用集群
  2. 转载:识别圆环的一种思路
  3. 现任明教教主共享胖AP与WLC安全配置录像.上半部分
  4. excel 两组数据交点_30秒即可完成Excel数据对比,超高效率,快学起来不要犹豫!...
  5. XenApp 6.0/6.5服务优化
  6. FPGA是如何搭建的
  7. iphone闪退修复工具_iOS14到底怎么样?汇总2866部iPhone的升级体验
  8. js中常用framesetiframe页面跳转传参方法实例大全
  9. php oauth单点登陆,php单点登录
  10. 《测绘综合能力》——摄影测量与遥感
  11. 【5G NR】工作频段和信道安排
  12. CentOS 官网下载 iso 镜像
  13. viser 饼图修改颜色
  14. Codevs 1183 泥泞的道路
  15. 站在巨人的肩膀上还是站在巨人的脚底下
  16. DirectX加速不可用、已禁用的解决方法(转载)
  17. 7-1 复数类的操作
  18. WannaCry勒索病毒分析过程**上**
  19. 客户下样单后怎么跟进?
  20. python爬取电子书_python爬取 “得到” App 电子书信息

热门文章

  1. ubuntu服务器修改保存文件,Ubuntu Server 如何永久保存iptables的设置?
  2. 如何查看有没有django及版本
  3. java无框架开发,DON: java 小型web项目快速开发框架,实现无配置,直接关注业务开发.主要解决请求分发解析...
  4. 想做Python自动化,这些Python常用知识你都掌握了吗?
  5. 字节软件测试岗二面:APP测试问题被虐哭了,直到看到这些知识点
  6. CO1 Introduction
  7. 解读cartographer/common/port.h--Cartographer(一)
  8. bar图设置距离 python_Python可视化分析:学会Matplotlib这几点就够了
  9. YOLOv5:道路损伤检测
  10. 实体-关系信息抽取上线使用F1值87.1% (附数据集)