类变量   

serialVersionUID,

DEFAULT_CAPACITY,

EMPTY_ELEMENTDATA,     容量为0.

DEFAULTCAPACITY_EMPTY_ELEMENTDATA    

默认容量为10, 但实际的容量以第一次添加操作时被操作对象的大小为准。

第一次被添加对象的size小于10时,ArrayList 的容量为10,

第一次被添加对象的szie大于10时,ArrayList的容量为被添加对象的大小。

这个逻辑可以避免多做一个无谓的new Object[10] 操作,(相对于之前版本的JDK而言) 。

如果你声明了容量大小为30,但是添加对象的size为100. 此时先会做new Object[30]操作,但接着会做扩容到100的操作。这样的声明操作貌似是不合理的,但也许会有程序员这么干,这样做不如调用无参构造函数。

实例变量   size,elementData,modCount(版本,继承于AbstractList)

modCount 意思是改变的次数,添加修改删除都会导致modCount++。

modCount 使用protected进行修饰,表明所有子类都可以直接操作这个变量。

JDK 1.8.0_144 集合框架之ArrayList

如果发现modCount和被期望的版本expectedModCount不同时则会抛出 ConcurrentModificationException异常 (多线程时另外一个线程做了添加修改删除操作)。

在JDK1.8 以前的版本里面,声明如下三个ArrayList,每个ArrayList的elementData 都会指向堆区的一个Object[0]对象, 但在JDK1.8里面,这三个ArrayList的elementData 都会指向同一个对象EMPTY_ELEMENTDATA 。

        ArrayList<String> test1 = new ArrayList<String>(0);
        ArrayList<String> test2 = new ArrayList<String>(0);
        ArrayList<String> test3 = new ArrayList<String>(0);

在JDK1.8 以前的版本里面,声明如下三个ArrayList,每个ArrayList的elementData 都会指向堆区的一个Object[10]对象, 但在JDK1.8里面,这三个ArrayList的elementData 都会指向同一个对象DEFAULTCAPACITY_EMPTY_ELEMENTDATA 。

        ArrayList<String> test1 = new ArrayList<String>();
        ArrayList<String> test2 = new ArrayList<String>();
        ArrayList<String> test3 = new ArrayList<String>();

可以看出在声明ArrayList时内存的消耗在的降低,不会有无谓的Object[0]或者Object[10]对象产生。类库工作者也真是太厉害,逻辑思维真是强。

构造函数。 无参构造函数,指定容器大小的构造函数,从一个集合构造出一个ArrayList。

JDK 1.8.0_144 集合框架之ArrayList

添加操作。

JDK 1.8.0_144 集合框架之ArrayList

在每次添加时都先判断容量够不够用,容量不够时做扩容操作。如果需要的容量大于Integer.MAX_VALUE

则抛出OutOfMemoryError() 异常。

在数组末尾添加一个元素,直接加在数组末尾。

在数组中间添加一个元素,将index后的元素都向后移动一位。

JDK 1.8.0_144 集合框架之ArrayList

在数组末尾添加一个数组,在数组中间添加一个数组。

两个集合做并集操作。 

JDK 1.8.0_144 集合框架之ArrayList

 

修改操作 

JDK 1.8.0_144 集合框架之ArrayList

 

批量修改操作,函数式编程

JDK 1.8.0_144 集合框架之ArrayList

 

删除操作 。删除指定位置的元素,删除单个元素,删除一群元素,根据指定条件删除元素(函数式编程),删除连续位置的元素。

JDK 1.8.0_144 集合框架之ArrayList

JDK 1.8.0_144 集合框架之ArrayList

 

是否包含操作,以及指定元素出现的位置(第一次出现和最后一次出现的位置)

JDK 1.8.0_144 集合框架之ArrayList

 

对数组进行排序, 按照指定Comparator 进行排序。

JDK 1.8.0_144 集合框架之ArrayList

序列化和反序列化。

JDK 1.8.0_144 集合框架之ArrayList

JDK 1.8.0_144 集合框架之ArrayList

反序列化和序列化是完全对称的操作。

取子范围操作subList。  注意操作子范围时原来的数组也会跟着变化,这跟copyOf和clone是不同的。

子范围是一种视图技术。。。 什么是视图技术。 为什么设计这么多接口最终只实现了为数不多的类。

JDK 1.8.0_144 集合框架之ArrayList

移除数组zise之后的null元素。

JDK 1.8.0_144 集合框架之ArrayList

Iterator操作和ListIterator操作(支持向前遍历)   

i >= elementData.length 也会抛出ConcurrentModificationException(抛出这个的场景还没有想清楚)

Object[] elementData = ArrayList.this.elementData; 内部类的使用语法。

JDK 1.8.0_144 集合框架之ArrayList

内部类:

JDK 1.8.0_144 集合框架之ArrayList

 

spliterator 没有看懂这是干嘛用的。

泛型方法,返回指定类型的数组。

JDK 1.8.0_144 集合框架之ArrayList

JDK 1.8.0_144 集合框架之ArrayList

 

返回Object 数组,但此数组无法通过强制类型转换成其他类型数组

JDK 1.8.0_144 集合框架之ArrayList

 

转载于:https://my.oschina.net/qidis/blog/1498986

相关文章: