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)的更多相关文章

  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. Linux中配置Aria2 RPC Server

    启动Aria2 RPC Server 直接在终端中执行aria2c --enable-rpc --rpc-allow-origin-all可直接开启RPC服务. 这种方法并不能进行个性化的参数设置,需 ...

  2. 洛谷P5206 数树

    题意: task0,给定两棵树T1,T2,取它们公共边(两端点相同)加入一张新的图,记新图连通块个数为x,求yx. task1,给定T1,求所有T2的task0之和. task2,求所有T1的task ...

  3. A1024. Palindromic Number

    A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...

  4. [luogu2822][组合数问题]

    题目链接 题解: 对于上面和下面的式子进行分解质因数,然后看看上面的质因数个数减去下面的质因数个数能不能达到k的质因数的要求即可. 分解质因数的时候用对于阶乘分解质因数的常用方法:比如要求1999!中 ...

  5. python---session(最终版)__setitem__和__getitem__方法

    一般来说对于其他语言session值一般获取方法为session['name'],赋值使用session['name']=val 对于python类中含有一些魔术方法__setitem__,__get ...

  6. 在eclipse中启动项目报java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space

    在我们启动项目的时候经常会出现内存溢出这个错误  设置一下内存就ok 错误信息 java.util.concurrent.ExecutionException: java.lang.OutOfMemo ...

  7. Spark记录-spark-env.sh配置

    环境变量 含义 SPARK_MASTER_IP master实例绑定的IP地址,例如,绑定到一个公网IP SPARK_MASTER_PORT mater实例绑定的端口(默认7077) SPARK_MA ...

  8. Hibernate or 的用法

    转自baidu estrictions.or(Restrictions.like(),Restrictions.or(Restrictions.like,........))里面的or可以无限加的.还 ...

  9. 关于JS事件冒泡与JS事件代理(事件委托)

    连接:https://blog.csdn.net/supercoooooder/article/details/52190100 核心代码: <ul id="parentUl" ...

  10. POJ 1811 Prime Test (Rabin-Miller强伪素数测试 和Pollard-rho 因数分解)

    题目链接 Description Given a big integer number, you are required to find out whether it's a prime numbe ...