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
- 介面和抽象理解抽象
- 如何理解 interface 介面
- Hybird介面的理解
- 介面(API)的理解API
- 深入理解Callable介面
- 什麼是介面,如何理解
- 用介面的思想來理解GraphQL
- 我所理解的介面設計
- Java的抽象類與介面理解Java抽象
- 介面測試之深入理解HTTPSHTTP
- 一文深入理解ConfigurationConditon 介面
- 如何理解HTTP代理IP的API介面HTTPAPI
- 關於抽象類和介面的初步理解抽象
- java介面和抽象類的簡單理解Java抽象
- 結合實戰理解 Java 抽象類和介面Java抽象
- 深入理解介面隔離原則:構建靈活的面向介面軟體
- 深入理解 PHP 的 7 個預定義介面PHP
- 深入理解ES6--12.代理與反射介面反射
- [原譯]實現IEnumerable介面&理解yield關鍵字
- 一個Demo帶你理解Android介面回撥機制Android
- 如何理解以太坊ABI - 應用程式二進位制介面
- 支付寶支付產品介面文件地址和支付寶代金券理解
- springboot~通過面向介面程式設計對控制反轉IOC的理解Spring Boot程式設計
- 個人理解emulateJSON作用 與java後臺介面引數的關係JSONJava
- 從零開始入門 K8s | 理解容器執行時介面 CRIK8S
- 介面卡模式(類介面卡,物件介面卡,介面介面卡)模式物件
- Lock介面之Condition介面
- API介面------外部介面和內部介面區別API
- java 介面,介面的特性,介面實現多型,面向介面程式設計Java多型程式設計
- 理解 this
- 類與介面(三)java中的介面與巢狀介面Java巢狀
- 『居善地』介面測試 — 2、介面和介面文件概念
- 介面卡模式(類介面卡 物件介面卡)模式物件
- 什麼是介面?如何定義介面?如何實現介面?
- 介面
- [徹底理解]JDK1.8 函式式介面 Consumer & Supplier 以及 JAVA新紀元 λ表示式的到來JDK函式Java