RandomAccessインタフェースの使用

4328 ワード

java.util.RandomAccess
使用法
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