ArrayList函数及相关解释

Posted 天堂1223

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayList函数及相关解释相关的知识,希望对你有一定的参考价值。

书接上回,如果大家感兴趣,可以先看我的第一篇博客ArrayList函数及相关解释(一)

2.16 rangeCheckForAdd(int index)函数

该函数用于当想列表中的指定位置添加数据的时候,判断指定的位置是否是在合法的范围之内,也就是是否是小于0或大于当前列表中的数据量。

private void rangeCheckForAdd(int index) 
        if (index > size || index < 0)
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    

2.17 outOfBoundsMsg(int index)函数

该函数是用于返回一个异常信息字符串,当列表操作抛出IndexOutOfBoundsException异常的时候,需要向用户传递异常信息,所以在这里封装相关异常详细信息的字符串告知用户哪一个位置出现异常。

private String outOfBoundsMsg(int index) 
        return "Index: "+index+", Size: "+size;
    

2.18 removeAll(Collection<?> c)函数

public boolean removeAll(Collection<?> c) 
        Objects.requireNonNull(c);
        return batchRemove(c, false);
    

该函数用于移除列表中包含集合c中元素的所有元素。通过函数体可以看出,首先系统判断了集合c是否为空,如果为空,则抛出空指针错误。接着调用批量移除元素的函数batchRemove。

2.19 batchRemove(Collection<?> c, boolean complement)函数

该函数是retainAll()函数和removeAll()函数的具体实现函数,其实现通过一个complement的boolean参数进行区分,我们看一下这个函数的实现。

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;
    

我们通过实际的例子,来学习该函数运用到的编程技巧。在这里调用该函数的列表我们称作原列表,参数列表我们称为参数列表。在这里我们先分析removeAll函数,其传入的complement参数为false。我们使用列表"12345678"作为原列表,使用"abc134"作为参数列表,我们开始该函数的运行。

说明rwc.contains(elementData[r]) == complementelementDatac
开始00-12345678abc134
100false12345678abc134
210true22345678abc134
321false22345678abc134
431false22345678abc134
541true25345678abc134
652true25645678abc134
763true25675678abc134
874true25678678abc134

到这里,try里面的循环便处理完成了,下面进入finally块,当出现r不等于原数组长度的时候,则进行数组拷贝。当w不等于原数组长度的时候,将剩下的数组的位置变为null,在该实例中,w=4,将数组后续的全部变为null,进行GC处理,这样,该数组就变成了"25678",完成了removeAll操作。

同样,retainAll()函数也是这样实现的,以此完成相关操作。

同时,ArrayList实现了Serializable接口,该接口用于对象的序列化和反序列化。并且使用writeObject()和readObject()方法实现了自定义序列化和反序列化。

后面的方法实际上是实现了ArrayList的迭代器,对于迭代器我们会进行专门的学习。同时也实现了面向过程的函数。

以上是关于ArrayList函数及相关解释的主要内容,如果未能解决你的问题,请参考以下文章

java基础-ArrayDeque学习

Java常见集合的默认大小及扩容机制

ArrayList扩容源码分析

效果器及音响相关术语解释

Java中Vector与ArrayList的差别具体解释

初学opencv c++学习笔记图像的相关操作及属性