🍁 作者:知识浅谈,CSDN 博客专家,阿里云签约博主,InfoQ 签约博主,华为云云享专家
📌 擅长领域:全栈工程师、爬虫、ACM 算法
💒 公众号:知识浅谈
Collections 之 ArrayList 源码解读(七)总结
正菜来了⛳⛳⛳
🎈ArrayList 相关函数
🍮writeObject(java.io.ObjectOutputStream s)
含义:这个函数的意思是把 elementData 数组中的元素按照顺序写入到数据流中,也就是序列化这个 ArrayList 对象。
方法中一个包含两种数据需要写入流中,一个是 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)
含义:这个函数的意思是把 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)
返回此列表在指定的 fromIndex(包括)和 toIndex(不包括)之间的部分的视图。
(如果 fromIndex 和 toIndex 相等,则返回列表为空。)返回列表由此列表支持,因此返回列表中的非结构性更改会反映在此列表中,反之亦然。返回的列表支持所有可选的列表操作。这种方法消除了显式范围操作的需要(通常存在于数组中的那种)。通过传递 subList 视图而不是整个列表,任何需要列表的操作都可以用作范围操作。
例如,以下成语从列表中删除一系列元素: 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 知识浅谈
评论