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