Java接口RandomAccess周全懂得。本站提示廣大學習愛好者:(Java接口RandomAccess周全懂得)文章只能為提供參考,不一定能成為您想要的結果。以下是Java接口RandomAccess周全懂得正文
在jdk文檔中對RandomAccess接口的界說以下: public interface RandomAccess
上面是jdk的注解翻譯
List 完成所應用的標志接口,用來注解其支撐疾速(平日是固准時間)隨機拜訪。此接口的重要目標是許可普通的算法更改其行動,從而在將其運用到隨機或持續拜訪列表時能供給優越的機能。
將操作隨機拜訪列表的最好算法(如 ArrayList )運用到持續拜訪列表(如 LinkedList )時,可發生二次項的行動。假如將某個算法運用到持續拜訪列表,那末在運用能夠供給較差機能的算法前,勉勵應用普通的列表算法檢討給定列表能否為此接口的一個 instanceof ,假如須要包管可接收的機能,還可以更改其行動。
如今曾經熟悉到,隨機和持續拜訪之間的差別平日是隱約的。例如,假如列表很年夜時,某些 List 完成供給漸進的線性拜訪時光,但現實上是固定的拜訪時光。如許的 List 完成平日應當完成此接口。
強調:JDK中推舉的是對List聚集盡可能要完成RandomAccess接口
假如聚集類是RandomAccess的完成,則盡可能用for(int i = 0; i < size; i++) 來遍歷而不要用Iterator迭代器來遍歷。
反過去,假如List是Sequence List,則最好用迭代器來停止迭代。
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()){} }
測試:
public class TestRandomAccess { @Test public void testTraverse() { ArrayList<Integer> arraylist = new ArrayList<Integer>(); LinkedList<Integer> linkedList = new LinkedList<Integer>(); initList(arraylist, 1000); initList(linkedList, 1000); System.out.println("ArrayList完成了RandomAccess接口"); implRandomAccessTraverse(arraylist); //花了10ms時光 System.out.println("LinkedList未完成了RandomAccess接口"); implRandomAccessTraverse(linkedList); //花了434ms時光 System.out.println("\nArrayList完成了RandomAccess接口"); noImplRandomAccessTraverse(arraylist); //花了39ms時光 System.out.println("LinkedList未完成了RandomAccess接口"); noImplRandomAccessTraverse(linkedList); //花了27ms時光 } private long startTime = 0; private long endTime = 0; // 初始化列表 public void initList(List<Integer> list, int n) { for (int i = 0; i < n; i++) { list.add(i); } } //有完成RandomAccess接口的遍歷全體數據, public void implRandomAccessTraverse(List list) { 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時光"); } //沒有完成RandomAccess接口的遍歷全體數據 public void noImplRandomAccessTraverse(List list) { 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時光"); } }
以上這篇Java接口RandomAccess周全懂得就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。