RandomAccessインタフェースの使用
4328 ワード
java.util.RandomAccess
使用法
Random Access List(ランダムアクセスリスト)は、
通常の方法では、遍歴する前に判断します.
ランダムアクセスリストはループループループを使用し、シーケンスアクセスリストは反復器ループを使用します.
JDK定義
ランダムアクセスとシーケンスアクセスの違いは通常曖昧であることが公認されている.例えば、いくつかの
比
速い
検証事例
使用法
Random Access List(ランダムアクセスリスト)は、
ArrayList
のようにインタフェースを実装し、Sequence Access List(シーケンスアクセスリスト)はLinkedList
のように実装しない.両者の効率的な遍歴アルゴリズムが異なるため通常の方法では、遍歴する前に判断します.
if (list instance of RandomAccess) {
for(int m = 0; m < list.size(); m++){}
}else{
Iterator iter = list.iterator();
while(iter.hasNext()){}
}
ランダムアクセスリストはループループループを使用し、シーケンスアクセスリストは反復器ループを使用します.
JDK定義
List
は、高速(通常は固定時間)ランダムアクセスをサポートすることを示すために使用されるタグインタフェースを実装する.このインタフェースの主な目的は、一般的なアルゴリズムがそれらの動作を変更し、ランダムまたは連続的にリストにアクセスするときにより良いパフォーマンスを提供することです.ArrayList
のようなランダムアクセスリストを操作する最良のアルゴリズムをシーケンスアクセスリスト(LinkedList
のような)に適用すると、二次的な動作が発生する.一般的なリストアルゴリズムは、与えられたリストがinstanceof
であるかどうかをチェックすることを奨励し、リストに順次アクセスする際に悪いアルゴリズムを使用することを防止し、許容可能な性能を保証する必要がある場合にアルゴリズムを変更することができる.ランダムアクセスとシーケンスアクセスの違いは通常曖昧であることが公認されている.例えば、いくつかの
List
が大きく実装されると、漸進的な線形アクセス時間が提供されるが、実際には一定のアクセス時間である.このようなList
インプリメンテーションは、通常、このインタフェースをインプリメントすべきである.一般に、List
の実装クラスは、このインタフェースを実装すべきである.for (int i=0, n=list.size(); i < n; i++)
list.get(i);
比
for (Iterator i=list.iterator(); i.hasNext(); )
i.next();
速い
検証事例
package com.ld.practice.arraylist;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.RandomAccess;
/**
* Random Access List( ) ArrayList Sequence Access List( ) LinkedList
*
* : ,
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public class ListLoopTest {
/**
* list, n
*
* @param list
* @return
*/
public static List initList(List list, int n) {
for (int i = 0; i < n; i++)
list.add(i);
return list;
}
/**
* list, RandomAccess
*
* @param list
*/
public static void accessList(List list) {
long startTime = System.currentTimeMillis();
if (list instanceof RandomAccess) {
System.out.println(" RandomAccess ...");
for (int i = 0; i < list.size(); i++) {
list.get(i);
}
} else {
System.out.println(" RandomAccess ...");
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
iterator.next();
}
}
long endTime = System.currentTimeMillis();
System.out.println(" :" + (endTime - startTime));
}
/**
* loop list
*/
public static void accessListByLoop(List list) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < list.size(); i++) {
list.get(i);
}
long endTime = System.currentTimeMillis();
System.out.println("loop :" + (endTime - startTime));
}
/**
*
*/
public static void accessListByIterator(List list) {
long startTime = System.currentTimeMillis();
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
iterator.next();
}
long endTime = System.currentTimeMillis();
System.out.println("Iterator :" + (endTime - startTime));
}
public static void main(String[] args) {
ArrayList aList = (ArrayList) initList(new ArrayList<>(), 2000000);
LinkedList lList = (LinkedList) initList(new LinkedList<>(), 50000);
accessList(aList);
accessList(lList);
System.out.println("ArrayList");
accessListByLoop(aList);
accessListByIterator(aList);
System.out.println("LinkedList");
accessListByLoop(lList);
accessListByIterator(lList);
}
}
RandomAccess ...
:8
RandomAccess ...
:2
ArrayList
loop :5
Iterator :8
LinkedList
loop :1532
Iterator :1