RandomAccess介面理解
根據javadoc上面的的解釋是:
RandomAccess 是一個標記介面,用於標明實現該介面的List支援快速隨機訪問,主要目的是使演算法能夠在隨機和順序訪問的list中表現的更加高效。
我們可以簡單的看下Collections下的binarySearch方法的原始碼:
- 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);
- }
從原始碼中我們可以看到,在進行二分查詢的時候,list會先判斷是否是RandomAccess也即是否實現了RandomAccess介面,接著在呼叫想用的二分查詢演算法來進行,(其中: BINARYSEARCH_THRESHOLD Collections的一個常量(5000),它是二分查詢的閥值。)如果實現了RandomAccess介面的List,執行indexedBinarySearch方法,否則執行 iteratorBinarySearch方法。
分別看下這兩個方法的實現:
indexedBinarySearch 方法:
- private static <T>
- int indexedBinarySearch(List<? extends Comparable<? super T>> list, T key) {
- int low = 0;
- int high = list.size()-1;
-
- while (low <= high) {
- int mid = (low + high) >>> 1;
- Comparable<? super T> midVal = list.get(mid);
- int cmp = midVal.compareTo(key);
-
- if (cmp < 0)
- low = mid + 1;
- else if (cmp > 0)
- high = mid - 1;
- else
- return mid; // key found
- }
- return -(low + 1); // key not found
- }
indexedBinarySearch 方法是直接通過get來訪問元素
iteratorBinarySearch方法:
- private static <T>
- int iteratorBinarySearch(List<? extends Comparable<? super T>> list, T key)
- {
- int low = 0;
- int high = list.size()-1;
- ListIterator<? extends Comparable<? super T>> i = list.listIterator();
-
- while (low <= high) {
- int mid = (low + high) >>> 1;
- Comparable<? super T> midVal = get(i, mid);
- int cmp = midVal.compareTo(key);
-
- if (cmp < 0)
- low = mid + 1;
- else if (cmp > 0)
- high = mid - 1;
- else
- return mid; // key found
- }
- return -(low + 1); // key not found
- }
iteratorBinarySearch中ListIterator來查詢相應的元素javadoc中特別指出:
It is recognized that the distinction between random and sequential access is often fuzzy. For example, some List implementations provide asymptotically linear access times if they get huge, but constant access times in practice. Such a Listimplementation should generally implement this interface. As a rule of thumb, a List implementation should implement this interface if, for typical instances of the class, this loop:
for (int i=0, n=list.size(); i < n; i++)
list.get(i);
runs faster than this loop:
for (Iterator i=list.iterator(); i.hasNext(); )
i.next();
總結:實現RandomAccess介面的的List可以通過簡單的for迴圈來訪問資料比使用iterator訪問來的高效快速。
參考文件:https://docs.oracle.com/javase/7/docs/api/java/util/RandomAccess.html
</div>
</div>
</article>
相關文章
- RandomAccess介面randomMac
- Java基礎系列-RandomAccessJavarandomMac
- RandomAccess 這個空架子有何用?randomMac
- 如何理解 interface 介面
- 介面和抽象理解抽象
- Hybird介面的理解
- 介面(API)的理解API
- 老婆理解的“介面”
- 如何理解介面-Java系列Java
- 什麼是介面,如何理解
- 深入理解Callable介面
- Golang interface介面深入理解Golang
- 用介面的思想來理解GraphQL
- Java的抽象類與介面理解Java抽象
- 我所理解的介面設計
- 如何理解HTTP代理IP的API介面HTTPAPI
- C#介面作用的深入理解C#
- C# 介面作用的深入理解C#
- java介面和抽象類的簡單理解Java抽象
- 關於抽象類和介面的初步理解抽象
- 介面測試之深入理解HTTPSHTTP
- 理解 TCP(六):網路程式設計介面TCP程式設計
- 我如何理解Java中抽象類和介面Java抽象
- 深入理解Java的介面和抽象類Java抽象
- OCI介面學習筆記--基本理解(二)筆記
- 結合實戰理解 Java 抽象類和介面Java抽象
- 我是如何理解Java抽象類和介面的Java抽象
- 深入理解介面隔離原則:構建靈活的面向介面軟體
- 深入理解 PHP 的 7 個預定義介面PHP
- 深入理解ES6--12.代理與反射介面反射
- 深入理解java的抽象類和介面(轉載)Java抽象
- C#----設計模式介面 工廠模式的理解C#設計模式
- 一文深入理解ConfigurationConditon 介面
- [原譯]實現IEnumerable介面&理解yield關鍵字
- MVP模式(2):你真的理解下抽象類和介面嗎??MVP模式抽象
- 理解FreeBSD中的圖形介面X系統(轉)
- 如何理解以太坊ABI - 應用程式二進位制介面
- 一個Demo帶你理解Android介面回撥機制Android