ArrayList源码-Remove方法流程
文章目标:
了解ArrayList的Remove流程
按下标进行删除的Rmove方法源码
首先要删除一个对象,有两种方法,一种是根据下标进行删除,一种是根据具体的元素进行删除
首先讲解根据下标进行删除的流程:
通过下标进行删除方法是这样的:
首先是将下标参数放入rangeCheck方法中进行判断,进入这个方法去看看:
这是对下标越界异常出现的一种处理,当下标大于等于数组的长度的时候,就会抛出数组越界异常.
如果没有,就继续下一步:
modCount加1, 表示对这个元素操作了一次.
之后,将数组中根据下标查找到具体的值,赋值给oldValue这个变量,
通过numMoved来确定删除这个元素需要移动多少的元素.
然后判断是否有元素删除,如果有就会调用System的.arraycopy方法,
这个方法的参数5个,一个一个来介绍:
通过jdk上面的注释,我们可以知道,左边开始的第一个参数src是源数组,即你准备要删除元素的数组, srcPos表示源数组要复制的起始位置,desc表示目标数组,length表示要复制的长度。
怎么复制呢,举个栗子:
原数组:int[] arraySrc = {1,2,3,4};
目标数组:int[] arrayDest = {0,0,0,0};
操作:将原数组第二个位置以后的3个数据copy到目标数组
System.arrayCopy(arraySrc,1,arrayDest,0,3);
目标数组得到的结果是:
arrayDest = {0,2,3,4};
这就是System的.arraycopy的使用方法.
回到Arraylist使用的这个方法上,Arraylist这边传入的参数是:
Src是elementData,下标为index参数+1,目标数组还是elementData,目标数组的下标是传入的index参数, 要复制的源数组元素的数量是上面计算好的numMoved.
这段代码是什么意思呢?
是将elementData数组从index+1的位置之后的元素,复制到element的index.
举栗子:
elementData: {1,2,3,4,5};
Index+1:2
elementData: {1,2,3,4,5};
index:1
numMoved:3
移动之后的结果:{1,3,4,5,5};
根据上面移动的例子:
可以看出数组的末端多出了一个重复的元素,所以,设计者在后面加入了
这段代码,通过将末尾的元素设置为null,来解决这多出来的元素问题,同时让GC收集器来回收这个元素就可以了.
之后就会将删除的元素返回给调用者,告知调用者删除的是哪一个元素.
整个按下标删除元素就完成了.
按元素进行删除的Rmove方法源码
跟上面的流程差不多,但现在传入的参数为具体的元素,
源码如下:
首先会判断传入的元素是否为null,如果为null,则遍历数组,将数组中为null的值进行删除,然后返回一个true.
如果不为null,则遍历数组看看是否有元素和传进来的参数相同,如果相同,则删除这个元素.
如果都不满足,则返回一个false,告诉调用者这个没有这个元素可以删除.
整个按元素删除的操作就完成了.