你的位置:首页 > 软件开发 > Java > JDK1.8源码阅读系列之一:ArrayList

JDK1.8源码阅读系列之一:ArrayList

发布时间:2017-01-17 00:00:20
本篇随笔主要描述的是我阅读 ArrayList 源码期间的对于 ArrayList 的一些实现上的个人理解,有不对的地方,请指出~  先来看一下 ArrayList 的继承图:    由图可以看出,ArrayList 的父类有 AbstractList、 AbstractColl ...

JDK1.8源码阅读系列之一:ArrayList

  本篇随笔主要描述的是我阅读 ArrayList 源码期间的对于 ArrayList 的一些实现上的个人理解,有不对的地方,请指出~

  先来看一下 ArrayList 的继承图:

  JDK1.8源码阅读系列之一:ArrayList

  由图可以看出,ArrayList 的父类有 AbstractList、 AbstractCollection ,所以我从 AbstractCollection 类开始阅读。

  

  一、AbstractCollection 类相关。

    AbstractCollection 类实现了 Collection 接口,并且由于 AbstractCollection 是一个抽象类,所以它只实现了一些 Collection 接口中的方法,例如 toArray() 方法, contains() 方法, remove() 方法等等。对于Collection 接口中含有的其它方法仍令其保持抽象实现,我认为这样实现的原因是 :抽象类的作用就是一个概括作用,它需要将其子类中含有的公共方法在抽象类中加以实现,而抽象类中仍然保持抽象的方法一般都是每个子类有自己的实现,在抽象类中是没有办法统一起来的。

    在 AbstractCollection 类中,我以为 finishToArray() 方法值得注意一下:

    JDK1.8源码阅读系列之一:ArrayList

  

    finishToArray() 方法是用来给数组 r[] 扩容的,每次当数组 r 的容量不足以容纳迭代器遍历到的元素时,就会对数组 r 进行扩容,并且对扩容后的数组容量进行校验(hugeCapacity())。

     扩容方法:newCap = cap + (cap >> 1)+ 1; 

 

  二、AbstractList 相关

    AbstractList 也是一个抽象类,其下面具体的子类主要有 LinkedList, ArrayList, Vector几种。所以 AbstractList 中含有的方法主要是对这几个具体的子类的抽象。

    我认为 AbstractList 中主要有以下几点值得注意:

    1、AbstractList 中 iterator() 和 listIterator() 均采用内部类方式实现。

    

 1 public Iterator<E> iterator() { 2     return new Itr(); 3 } 4  5 public ListIterator<E> listIterator() { 6     return listIterator(0); 7 } 8  9 public ListIterator<E> listIterator(final int index) {10     rangeCheckForAdd(index);11 12     return new ListItr(index);13 }14 15 private class Itr implements Iterator<E> {16   17       ......18 19 }20 21 private class ListItr extends Itr implements ListIterator<E> {22       ......23 }  

原标题:JDK1.8源码阅读系列之一:ArrayList

关键词:jdk

jdk
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。