Collections之ArrayList源码解读(五)

举报
知识浅谈 发表于 2022/10/04 10:10:53 2022/10/04
【摘要】 Collections之ArrayList源码解读(五)

在这里插入图片描述

🍁 作者:知识浅谈,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的列表的相关含义解读,希望有所帮助。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。