版权声明:本文为博主原创文章,转载请注明出处:http://blog.jerkybible.com/2017/08/22/Java源码之ArrayList/
访问原文「Java源码之ArrayList」
关于ArrayList
相信ArrayList
是小伙伴们在Java开发中经常会使用的类之一。那么ArrayList
究竟是一个什么类呢。大概来说它是List
接口的可调整大小的数组实现。 实现所有可选列表操作,并允许所有元素,包括null。除了实现List
接口之外,他的类还提供了一些方法来操纵数组的内部大小来存储列表。 也就是说ArrayList
内部是由数组实现,往ArrayList
中放置元素也是默认按照先后顺序进行放置;它的大小是可调整的,不用像使用数组一样担心它不够存放数据(这里排除内存限制)。
总的来说ArrayList
不论从使用还是理解上都是比较简单的,那么让我们来分析一下其中的一些关键方法吧。
关键成员变量
下面列出了ArrayList
的关键成员变量,数量并不多,可以看到元素在ArrayList
中是存储在数组中的。
插入方法
最简单的方法就是add
一个元素,下面是这个方法的源码。这个方法比较简单,但我们看第一步是ensureCapacityInternal
,这个方法是检测新size
是否超出目前可容纳的最大值,超出的话需要扩展容量,最后走到grow
方法中,具体代码下面已经给出。需要注意的是modCount++
这一句,这个变量表示此列表已被结构修改的次数,结构修改是改变列表大小的那些修改,或以其他方式扰乱它,使得正在进行的迭代可能产生不正确的结果。也就是说在迭代的时候进行结构修改将导致程序出错。
另外一个常用的插入就是在指定位置插入,例如在首位(index为0)的位置插入等等。下面是这部分的源码,比较好理解,关键部分已经加上注释。
|
|
其次还有addAll
方法,分别为向列表最后插入和指定位置插入两个方法,这两个方法都是在add
方法上延伸出来的,很好理解,不再赘述。
删除方法
删除元素也是我们经常使用的方法,首先看按照索引删除元素。下面的代码注释已经比较明白,需要注意的是rangeCheck
这个方法只检测index是否大于等于size,不检测是否小于0。这是因为是否小于0在访问数组时进行检测。
下面是根据删除指定元素。指定的元素可以为null,在找到指定元素的位置(索引)后,通过fastRemove
删除元素。
|
|
还有用的比较多的是批量删除,以其中一个方法为例,如下。可见这个函数交由方法removeAll
处理。在removeAll
中,并没有删除,而是遍历每一个元素,判断是否需要保留,不需要保留的会被需要保留的覆盖。可能这句话不好理解,可以看一下具体的代码。
查询方法
查询方法是必须了解的,因为我们存起来也是为了获取。这个方法非常的简单,只做简单的参数检验,然后返回对应下标的元素。
|
|
总结一下
基本上把ArrayList涉及的关键函数都做了详细说明。其余的一些都比较好理解了。