“`” 查看源码我们发现实际上 RandomAccess 接口中什么都没有定义。所以,在我看来 RandomAccess 接口不过是一个标识罢了。标识什么? 标识实现这个接口的类具有随机访问功能。

在 <code>binarySearch(</code>)方法中,它要判断传入的list 是否 <code>RamdomAccess</code> 的实例,如果是,调用<code>indexedBinarySearch()</code>方法,如果不是,那么调用<code>iteratorBinarySearch()</code>方法</p>

<pre><code>java public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key) { if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD) return Collections.indexedBinarySearch(list, key); else return Collections.iteratorBinarySearch(list, key); }</code></pre>

<code>ArrayList</code> 实现了 <code>RandomAccess</code> 接口, 而 <code>LinkedList</code> 没有实现。为什么呢?我觉得还是和底层数据结构有关!<code>ArrayList</code> 底层是数组,而 <code>LinkedList</code> 底层是链表。数组天然支持随机访问,时间复杂度为 O(1),所以称为快速随机访问。链表需要遍历到特定位置才能访问特定位置的元素,时间复杂度为 O(n),所以不支持快速随机访问。,<code>ArrayList</code> 实现了 <code>RandomAccess</code> 接口,就表明了他具有快速随机访问功能。 <code>RandomAccess</code> 接口只是标识,并不是说 <code>ArrayList</code> 实现 <code>RandomAccess</code> 接口才具有快速随机访问功能的!

<strong>下面再总结一下 list 的遍历方式选择:</strong>

<ul><li>实现了 <code>RandomAccess</code> 接口的list,优先选择普通 for 循环 ,其次 foreach,</li><li>未实现 <code>RandomAccess</code>接口的list,优先选择iterator遍历(foreach遍历底层也是通过iterator实现的,),大size的数据,千万不要使用普通for循环</li></ul>

<pre><code> "“`

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.