开课吧之Java常见面试题之RandomAccess接口

**RandomAccess接口?**

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

在 binarySearch()办法中,它要断定传入的list 是否 RamdomAccess 的实例,假如是,调用indexedBinarySearch()办法,假如不是,那么调用iteratorBinarySearch()办法

```c

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);

}

```

ArrayList 实现了 RandomAccess 接口, 而 LinkedList 没有实现。为什么呢?我认为照样和底层数据构造有关!

ArrayList 底层是数组,而 LinkedList 底层是链表。数组天然支撑随机拜访,时光复杂度为 O(1),所以称为快速随机拜访。链表须要遍历到特定地位才能拜访特定地位的元素,时光复杂度为 O(n),所以不支撑快速随机拜访。

ArrayList 实现了 RandomAccess 接口,就注解了他具有快速随机拜访功能。 RandomAccess 接口只是标识,并不是说 ArrayList 实现 RandomAccess 接口才具有快速随机拜访功能的!

下面再总结一下 list 的遍历方法选择:

实现了 RandomAccess 接口的list,优先选择通俗 for 轮回 ,其次 foreach,

未实现 RandomAccess接口的list,优先选择iterator遍历(foreach遍历底层也是经由过程iterator实现的,),大年夜size的数据,切切不要应用通俗for轮回。