天天看点

Java源码阅读笔记——Collections.reverse方法

首先看一下源码的reverse()方法是怎么写的

Java源码阅读笔记——Collections.reverse方法

 注意到有两个地方需要弄清楚一下

REVERSE_THRESHOLD:阈值,设置的是18。

RandomAccess:这是jdk中的一个空接口,空接口一般只是作为一个标记接口。jdk文档中是这么说的:RandomAccess是一个被用于List接口的实现类,用来标记该实现类支持快速随机访问,比如ArrayList,当程序遍历这个实现类时,如果它实现了RandomAccess接口,就可以根据这个接口标识来选择更高效的遍历方式。

从if条件判断可以看出,如果list的size小于阈值18或者list是一个支持快速随机访问的list的时候,调用swap方法交换首尾元素,首尾下标一次向后向前推。swap方法内部是调用list的set(index)和get(index)方法实现的

如果list的size大于阈值18且list不支持快速随机访问(比如LinkedList),则需要借助List的listIterator()迭代器。使用一个头指针和一个尾指针。交换两个指针指向的元素,然后将两个指针向中间移动。

那么,问题来了。为什么要用listIterator()呢?

从代码中我们可以看到ListIterator对象跟普通的Iterator对象相比,不仅可以从前往后遍历list,还可以从后往前遍历List。使用previous()方法向前遍历。而且它还可以在遍历的过程中通过set方法修改元素。Iterator是不允许的。Iterator只支持删除操作,通过remove()方法。只有List接口及其子接口和实现类才有listIterator迭代器。