关于接口 RandomAccess
生活随笔
收集整理的這篇文章主要介紹了
关于接口 RandomAccess
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天看到java.util.Collections這個工具類中的
public static <T> void fill(List<? super T> list, T obj) {int size = list.size();if (size < FILL_THRESHOLD || list instanceof RandomAccess) { // 這一行for (int i=0; i<size; i++)list.set(i, obj);} else {ListIterator<? super T> itr = list.listIterator();for (int i=0; i<size; i++) {itr.next();itr.set(obj);}}}上面代碼中標識的一行, FILL_THRESHOLD 是25,就是說,如果要填充的目標List范圍不是很大,那么就直接用上面的方式效率比較高,同時注意到 ? list instanceof RamdomAccess 這個代碼,順便翻到里面去瞅了一眼,RamdomAccess 接口是一個空接口,空接口的作用一般起到一個標識作用,比如:Serializable 接口。
RaomdomAccess接口里面的文檔說明大致意思:給可以提供隨機訪問的List實現去標識一下,這樣使用這個List的程序在遍歷這種類型的List的時候可以有更高效率。僅此而已。
所以,我們在遍歷List之前,可以用 ?if( list instanceof RamdomAccess ) 來標識一下,選擇用哪種遍歷方式。
?
?
測試代碼:
package com.zslin.list.demo;import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.RandomAccess;//JDK中說的很清楚,在對List特別是Huge size的List的遍歷算法中, // 要盡量來判斷是屬于RandomAccess(如ArrayList)還是Sequence List (如LinkedList), // 因為適合RandomAccess List的遍歷算法,用在Sequence List上就差別很大,常用的作法就是: // 要作一個判斷: // if (list instance of RandomAccess) { // for(int m = 0; m < list.size(); m++){} // }else{ // Iterator iter = list.iterator(); // while(iter.hasNext()){} // }/*** * @author WQ<br>* @version 創建時間:2017年6月18日 下午6:01:14<br>*/ public class TestRandomAccess {// 初始化列表public static void initList(List list, int n) {for (int i = 0; i < n; i++) {list.add(i);}}// 使用循環進行對列表的迭代public static void traverseWithLoop(List list) {long starttime = 0;long endtime = 0;starttime = System.currentTimeMillis();for (int count = 0; count <= 1000; count++) {for (int i = 0; i < list.size(); i++) {list.get(i);}}endtime = System.currentTimeMillis();System.out.println("使用loop迭代一共花了" + (endtime - starttime) + "ms時間");}// 使用迭代器對列表進行迭代public static void traverseWithIterator(List list) {long starttime = 0;long endtime = 0;starttime = System.currentTimeMillis();for (int count = 0; count <= 1000; count++) {for (Iterator itr = list.iterator(); itr.hasNext();) {itr.next();}}endtime = System.currentTimeMillis();System.out.println("使用Iterator迭代一共花了" + (endtime - starttime) + "ms時間");}public static void traverse(List list) {long starttime = 0;long endtime = 0;if (list instanceof RandomAccess) {System.out.println("該list實現了RandomAccess接口");starttime = System.currentTimeMillis();for (int count = 0; count <= 1000; count++) {for (int i = 0; i < list.size(); i++) {list.get(i);}}endtime = System.currentTimeMillis();System.out.println("迭代一共花了" + (endtime - starttime) + "ms時間");} else {System.out.println("該list未實現RandomAccess接口");starttime = System.currentTimeMillis();for (int count = 0; count <= 1000; count++) {for (Iterator itr = list.iterator(); itr.hasNext();) {itr.next();}}endtime = System.currentTimeMillis();System.out.println("迭代一共花了" + (endtime - starttime) + "ms時間");}}public static void main(String[] args) {ArrayList arraylist = new ArrayList();LinkedList linkedlist = new LinkedList();initList(arraylist, 1000);initList(linkedlist, 1000);traverse(arraylist);traverse(linkedlist);traverseWithIterator(arraylist);traverseWithLoop(arraylist);traverseWithIterator(linkedlist);traverseWithLoop(linkedlist);} }?
運行結果如下:
該list實現了RandomAccess接口 迭代一共花了9ms時間 該list未實現RandomAccess接口 迭代一共花了10ms時間 使用Iterator迭代一共花了12ms時間 使用loop迭代一共花了7ms時間 使用Iterator迭代一共花了14ms時間 使用loop迭代一共花了396ms時間?
?
?
以上。
?
轉載于:https://www.cnblogs.com/mr-wuxiansheng/p/7044899.html
總結
以上是生活随笔為你收集整理的关于接口 RandomAccess的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django搭建简易博客教程(四)-Mo
- 下一篇: Netty对Protocol Buffe