Collections之ArrayList源码解读(七)

举报
知识浅谈 发表于 2022/10/06 10:22:00 2022/10/06
【摘要】 Collections之ArrayList源码解读(七)

在这里插入图片描述

Collections之ArrayList源码解读(七)总结

正菜来了⛳⛳⛳

🎈ArrayList相关函数

🍮writeObject(java.io.ObjectOutputStream s)

  1. 含义:这个函数的意思是把elementData数组中的元素按照顺序写入到数据流中,也就是序列化这个ArrayList对象。
  2. 方法中一个包含两种数据需要写入流中,一个是ArrayList中的size,即数组中元素的个数,其实是每个元素。
private void writeObject(java.io.ObjectOutputStream s)
        throws java.io.IOException{
        // Write out element count, and any hidden stuff
        int expectedModCount = modCount;
        s.defaultWriteObject();

        // Write out size as capacity for behavioural compatibility with clone()
        s.writeInt(size);

        // Write out all elements in the proper order.
        for (int i=0; i<size; i++) {
            s.writeObject(elementData[i]);
        }

        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
    }

🍮readObject(java.io.ObjectInputStream s)

  1. 含义:这个函数的意思是把s数据流中的数据反序列化为ArrayList数组的元素,和上边的那个writeObject方法的作用是相反的。
private void readObject(java.io.ObjectInputStream s)
    throws java.io.IOException, ClassNotFoundException {
    elementData = EMPTY_ELEMENTDATA;

    // Read in size, and any hidden stuff
    s.defaultReadObject();

    // Read in capacity
    s.readInt(); // ignored

    if (size > 0) {
        // be like clone(), allocate array based upon size not capacity
        int capacity = calculateCapacity(elementData, size);
        SharedSecrets.getJavaOISAccess().checkArray(s, Object[].class, capacity);
        ensureCapacityInternal(size);

        Object[] a = elementData;
        // Read in all elements in the proper order.
        for (int i=0; i<size; i++) {
            a[i] = s.readObject();
        }
    }
}

🍮listIterator(int index)

含义: 这个函数的主要作用就是把ArrayList列表转化为List的迭代器对象,返回elementData中指定位置为初始迭代值,然后通过next获取下一个迭代值。

public ListIterator<E> listIterator(int index) {
    if (index < 0 || index > size)
        throw new IndexOutOfBoundsException("Index: "+index);
    return new ListItr(index);
}

🍮 class Itr implements Iterator<E>

这个内部类主要是实现Iterator接口的,重写Iterator中的next和remove和forEachRemaining方法。

🍮 class ListItr extends Itr implements ListIterator<E>

AbstractList.ListItr 的优化版本。

🍮 List<E> subList(int fromIndex, int toIndex)

  1. 返回此列表在指定的 fromIndex(包括)和 toIndex(不包括)之间的部分的视图。
  2. (如果 fromIndex 和 toIndex 相等,则返回列表为空。)返回列表由此列表支持,因此返回列表中的非结构性更改会反映在此列表中,反之亦然。返回的列表支持所有可选的列表操作。这种方法消除了显式范围操作的需要(通常存在于数组中的那种)。通过传递 subList 视图而不是整个列表,任何需要列表的操作都可以用作范围操作。
  3. 例如,以下成语从列表中删除一系列元素: list.subList(from, to).clear();
public List<E> subList(int fromIndex, int toIndex) {
    subListRangeCheck(fromIndex, toIndex, size);
    return new SubList(this, 0, fromIndex, toIndex);
}

这个SubList是一个内部类。

🍮sort()方法

这个就是我们常用的Arraylist的排序方法,因为Arraylist底层是用数组来实现的,所以具体实现的时候还是使用Arrays.sort方法来对elementData数组进行排序。

    @Override
    @SuppressWarnings("unchecked")
    public void sort(Comparator<? super E> c) {
        final int expectedModCount = modCount;
        Arrays.sort((E[]) elementData, 0, size, c);
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
        modCount++;
    }

🍚总结

以上是关于ArraList的函数的总结,其中还有一些不是太常用的就没有一一列出来了,希望有所帮助,ArrayList到这旧结束了,接下来我们去读另一个LinkedList的源码。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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