1.特点:

  ArrayList 是一个动态数组,它是线程不安全的,允许元素为null

  可重复,插入有序

  读写快,增删慢

  扩容:默认容量 10,默认扩容1.5倍

  建议指定容量大小,减少扩容带来的性能消耗

2.构造方法

  只分析复杂的

  public ArrayList(Collection<? extends E> c)

    c.toArray()  在Collection接口中定义的接口方法,ArrayList中调用的是Arrays.copyOf(elementData, size)方法(注:扩容也是使用此方法,高频率方法),调用的是System.arraycopy          

  1. public static native void arraycopy(Object src, int srcPos,
  2. Object dest, int destPos,
  3. 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)

  1. public void add(int index, E element) {
  2. rangeCheckForAdd(index);//越界判断 如果越界抛异常
  3.  
  4. ensureCapacityInternal(size + 1); // Increments modCount!!
  5. System.arraycopy(elementData, index, elementData, index + 1,
  6. size - index); //将index开始的数据 向后移动一位
  7. elementData[index] = element;
  8. size++;
  9. }

  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

  1. private boolean batchRemove(Collection<?> c, boolean complement) {
  2. final Object[] elementData = this.elementData;
  3. int r = 0, w = 0;
  4. boolean modified = false;
  5. try {
  6. for (; r < size; r++)
  7. if (c.contains(elementData[r]) == complement)
  8. elementData[w++] = elementData[r];
  9. } finally {
  10. // Preserve behavioral compatibility with AbstractCollection,
  11. // even if c.contains() throws.
  12. if (r != size) {
  13. System.arraycopy(elementData, r,
  14. elementData, w,
  15. size - r);
  16. w += size - r;
  17. }
  18. if (w != size) {
  19. // clear to let GC do its work
  20. for (int i = w; i < size; i++)
  21. elementData[i] = null;
  22. modCount += size - w;
  23. size = w;
  24. modified = true;
  25. }
  26. }
  27. return modified;
  28. }

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倍扩容

  1. int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
  2. capacityIncrement : oldCapacity);

https://blog.csdn.net/zxt0601/article/list/2

https://blog.csdn.net/ljcITworld/article/details/52041836

ArrayList源码分析笔记(jdk1.8)的更多相关文章

  1. ArrayList源码分析笔记

    ArrayList源码分析笔记 先贴出ArrayList一些属性 public class ArrayList<E> extends AbstractList<E> imple ...

  2. ArrayList 源码分析(JDK1.8)

    ArrayList简介  ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAccess ...

  3. ArrayList源码分析(JDK1.8)

    概述 ArrayList底层是基于数组实现的,并且支持动态扩容的动态数组(变长的集合类).ArrayList允许空值和重复的元素,当向ArrayList中添加元素数量大于其底层数组容量时,会通过扩容机 ...

  4. ArrayList 源码分析 基于jdk1.8:

    1:数据结构: transient Object[] elementData;  //说明内部维护的数据结构是一个Object[] 数组 成员属性: private static final int ...

  5. ArrayList源码分析--jdk1.8

    ArrayList概述   1. ArrayList是可以动态扩容和动态删除冗余容量的索引序列,基于数组实现的集合.  2. ArrayList支持随机访问.克隆.序列化,元素有序且可以重复.  3. ...

  6. ArrayList源码解读(jdk1.8)

    概要 上一章,我们学习了Collection的架构.这一章开始,我们对Collection的具体实现类进行讲解:首先,讲解List,而List中ArrayList又最为常用.因此,本章我们讲解Arra ...

  7. java集合系列之ArrayList源码分析

    java集合系列之ArrayList源码分析(基于jdk1.8) ArrayList简介 ArrayList时List接口的一个非常重要的实现子类,它的底层是通过动态数组实现的,因此它具备查询速度快, ...

  8. zeromq源码分析笔记之线程间收发命令(2)

    在zeromq源码分析笔记之架构说到了zmq的整体架构,可以看到线程间通信包括两类,一类是用于收发命令,告知对象该调用什么方法去做什么事情,命令的结构由command_t结构体确定:另一类是socke ...

  9. Java集合干货——ArrayList源码分析

    ArrayList源码分析 前言 在之前的文章中我们提到过ArrayList,ArrayList可以说是每一个学java的人使用最多最熟练的集合了,但是知其然不知其所以然.关于ArrayList的具体 ...

随机推荐

  1. 【洛谷P1248】加工生产调度

    题目大意:某工厂收到了n个产品的订单,这n个产品分别在A.B两个车间加工,并且必须先在A车间加工后才可以到B车间加工.某个产品i在A.B两车间加工的时间分别为Ai.Bi.怎样安排这n个产品的加工顺序, ...

  2. win+R快捷启动程序

    win10: Win+R cmd:命令行程序 notepad:记事本 winword:word文档 calc:记事本 mspaint:画图 wordpad:写字板

  3. spring对事务的配置

    接下来我将给大家介绍spring事务配置的两种方式: 1.基于XML的事务配置.2.基于注解方式的事务配置. 前言:在我们详细介绍spring的两种声明式事务管理之前,我们需要先理解这些概念 1)sp ...

  4. 无法SSH服务器的解决过程(openssh-daemon is stopped)

    公司某台服务器不知为何无法ssh连接上,进入现场查看: 1.执行netstat -atnlp|grep ssh,没有找到ssh端口 2.执行ps aux|grep ssh,没找到相关进程 3.执行se ...

  5. Linux 防火墙iptables开放特定端口

    1.查看状态:iptables -L -n2.直接编辑:vi /etc/sysconfig/iptables3.端口开放:-A INPUT -m state --state NEW -m tcp -p ...

  6. 泛型List小项目

    页面设计: 显示图书列表运行效果: 添加集合元素运行效果: 插入集合元素运行效果: 删除选中对象: 项目我已经上传到我的百度云盘,下载链接:http://pan.baidu.com/s/1mi3BjY ...

  7. POJ1185 状压dp(二进制//三进制)解法

    很显然这是一道状压dp的题目 由于每个最优子结构和前两行有关,一个显而易见的想法是用三维dp[i][j][k]用来记录在第i行下为j状态,i - 1行为k状态时的最大值,然而dp[100][1 < ...

  8. JavaScript模板代码总结

    //中文input框对非中文的校验 var reg=/[^\u4E00-\u9FA5]/g; if (reg.test($("#jgqc").val())){ alert(&quo ...

  9. Scala进阶之路-Scala中的高级类型

    Scala进阶之路-Scala中的高级类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类型(Type)与类(Class)的区别 在Java里,一直到jdk1.5之前,我们说 ...

  10. javascript 体验倒计时:距离国庆还有多长时间

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...