写点什么

Collections 之 Arraylist 源码解读 (五)

作者:知识浅谈
  • 2022 年 10 月 05 日
    吉林
  • 本文字数:1513 字

    阅读完需:约 5 分钟


🍁 作者:知识浅谈,CSDN 博客专家,阿里云签约博主,InfoQ 签约博主,华为云云享专家

📌 擅长领域:全栈工程师、爬虫、ACM 算法

💒 公众号:知识浅谈


Collections 之 Arraylist 源码解读(五)总结


正菜来了⛳⛳⛳

🎈ArrayList 中相关方法函数解读

🍮lastIndexOf(Object o)

这个函数的含义是从底层数组后边向前查找,找到第一个对象等于 o 的位置并返回,如果没有就返回-1,更正式地说,返回满足 (o==null ? get(i)==null : o.equals(get(i))) 的最高索引 i,如果没有这样的索引,则返回 -1。


public int lastIndexOf(Object o) {    if (o == null) {        for (int i = size-1; i >= 0; i--)            if (elementData[i]==null)                return i;    } else {        for (int i = size-1; i >= 0; i--)            if (o.equals(elementData[i]))                return i;    }    return -1;}
复制代码

🍮clone()

这个函数的作用是新创建一个 ArrayList 数组,并把当前的 Arraylist 中的底层的数组进行拷贝一份,把新 ArrayList 的 elementData 指向新的创建的数组。


    public Object clone() {        try {            ArrayList<?> v = (ArrayList<?>) super.clone();            v.elementData = Arrays.copyOf(elementData, size);            v.modCount = 0;            return v;        } catch (CloneNotSupportedException e) {            // this shouldn't happen, since we are Cloneable            throw new InternalError(e);        }    }
复制代码


方法中调用的 Arrays.copyOf 是一种深拷贝的方法。

🍮get(int index)

这个最常见的方法,见名知意,返回对应索引位置的的元素,但是返回之前先检查索引是都超出了范围。


public E get(int index) {    rangeCheck(index);
return elementData(index);}
复制代码


上边方法中调用了 rangeCheck(index)这个函数主要是判断 index 大于等于 size,会抛出 IndexOutOfBoundsException 索引溢出异常。

🍮E set(int index, E element)

同样这个也是见文知意,先进行检查,判断索引是否超出了 elementData 的容器的范围,如果没有超出,再在指定的位置上设置相应的元素,并把旧元素返回。


    public E set(int index, E element) {        rangeCheck(index);
E oldValue = elementData(index); elementData[index] = element; return oldValue; }
复制代码

🍮add(E e)

这个函数的作用是在 ArrayList 列表中添加一个元素,但是添加元素之前需要做一些检查,如数组长度的大小能够添加元素的大小。


    public boolean add(E e) {        ensureCapacityInternal(size + 1);  // Increments modCount!!        elementData[size++] = e;        return true;    }
复制代码


上边函数中调用的 ensureCapacityInternal 会先判断 elementData 数组是否为空,不为空返回 size+1 ,然后再判断 size+1 和 elementData 的数组的长度的大小,如果 elementData 较小的话,进行一个扩容。

🍮remove(int index)

这个函数的含义就是移除指定位置的元素,但是一处之前先判断索引是否合理,合理之后再把 index 后边的元素向前移动一位。


    public E remove(int index) {        rangeCheck(index);
modCount++; E oldValue = elementData(index);
int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // clear to let GC do its work
return oldValue; }
复制代码

🍚总结

以上是关于 ArrayList 的列表的相关含义解读,希望有所帮助。

发布于: 刚刚阅读数: 3
用户头像

知识浅谈

关注

公众号:知识浅谈 2022.06.22 加入

🍁 作者:知识浅谈,InfoQ签约作者,CSDN博客专家/签约讲师,华为云云享专家,阿里云签约博主 📌 擅长领域:全栈工程师、爬虫、ACM算法 💒 公众号:知识浅谈 🔥 联系方式vx:zsqtcc

评论

发布
暂无评论
Collections之Arraylist源码解读(五)_ArrayList_知识浅谈_InfoQ写作社区