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