写点什么

Collections 之 ArrayList 源码解读 (七)

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

    阅读完需:约 6 分钟


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

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

💒 公众号:知识浅谈


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 的源码。Written By 知识浅谈

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

知识浅谈

关注

公众号:知识浅谈 2022.06.22 加入

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

评论

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