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

首先看一下源码的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迭代器。

 

 

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值