ListインタフェースにおけるArrayList,LinkedList,Vectorの値取り方法のいくつかの性能テストについて

5053 ワード

Listインタフェースの下のArrayList、LinkedList、Vectorの値の取り方のテスト:
ArrayListの値取り方法のテスト:
package com.test.collections.list;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * 
 * ArrayList 
 * @author work
 *
 */
public class TestArraryList{
	
	private static ArrayList<String> strs = new ArrayList<String>();
	/**
	 *  
	 * @param arrays  
	 */
	private static void setValue(String[] arrays){
		strs.toArray(arrays);
	}
	
	/**
	 *  
	 */
	private static void setValue(){
		for(int i=0; i<10000000; i++){
			strs.add("strs"+i);
		}
	}
	
	private static void iterValue(){
		long start = System.currentTimeMillis();
		for (Iterator<String> iterator = strs.iterator(); iterator.hasNext();) {
			String str = (String) iterator.next();
			//System.out.println(" iterator value "+ str);
		}
		long end = System.currentTimeMillis();
		System.out.println(" ArrayList iterValue   :" + (end-start));
	}
	
	private static void forValue(){
		long start = System.currentTimeMillis();
		for (int i = 0; i < strs.size(); i++) {
			strs.get(i);
		}
		long end = System.currentTimeMillis();
		System.out.println(" ArrayList forValue   :" + (end-start));
	}

	public static void main(String[] args){
		setValue();
		iterValue();
		forValue();
		
	}
	

}

実行結果は次のとおりです.
ArrayList iterValue消費時間:50
ArrayList forValue消費時間:3
iteratorを使用して値を取得する場合、元のforサイクルよりも明らかに遅いのは、ArrayListがリストベースの配列であるべきであり、配列が下付きでデータを取得するのが最も速い方法である.
LinkedListの例を見てみましょう.
package com.test.collections.list;

import java.util.Iterator;
import java.util.LinkedList;

public class TestLinkedList {
	
	private static LinkedList<String> strings = new LinkedList<String>();
	
	/**
	 *  
	 */
	private static void setValue(){
		for(int i=0; i<100000; i++){
			strings.add("str"+i);
		}
	}
	
	/**
	 *  
	 * @param strs
	 */
	private static void setArrayValue(String[] strs){
		strings.toArray(strs);
	}
	
	private static void iterValue(){
		long start = System.currentTimeMillis();
		for (Iterator<String> iterator = strings.iterator(); iterator.hasNext();) {
			String str = (String) iterator.next();
			//System.out.println(" iterator value "+ str);
		}
		long end = System.currentTimeMillis();
		System.out.println(" linkedList iterValue   :" + (end-start));
	}
	
	private static void forValue(){
		long start = System.currentTimeMillis();
		for (int i = 0; i < strings.size(); i++) {
			strings.get(i);
		}
		long end = System.currentTimeMillis();
		System.out.println(" linkedList forValue   :" + (end-start));
	}

	public static void main(String[] args) {
		//String[] val = new String[]{"dddd","dddss","ssss","ggg","eee"};
		//setArrayValue(val);
		setValue();
		iterValue();
		forValue();
	}

}

注意:LinkedListを使用している間は集合要素の個数も最初は1000000に設定されていましたが、実行中に元のforループを使用している間に直接メモリがオーバーフローしたため、要素の個数は100000に変更されました.
実行結果は次のとおりです.
linkedList iterValue消費時間:6
linkedList forValue消費時間:11982
iteratorを使用するのは非常に速いが、元のforサイクルを使用する場合、性能があまりにも悪い.その原因を究明すると、LinkedListは双方向チェーンテーブルの実現に基づいており、チェーンテーブルでポインタを使用するのは下付き文字を使用するよりもデータを取得するのがずっと速い.
Vectorのテストを見てみましょう.
package com.test.collections.list;

import java.util.Iterator;
import java.util.Vector;

public class TestVector {
	
	private static Vector<String> strings = new Vector<String>();
	
	/**
	 *  
	 * @param arrays
	 */
	private static void setValue(String[] arrays){
		strings.toArray(arrays);
	}
	
	/**
	 *  
	 */
	private static void setValue(){
		for(int i=0; i<10000000; i++){
			strings.add("str"+i);
		}
	}
	
	private static void iterValue(){
		long start = System.currentTimeMillis();
		for (Iterator<String> iterator = strings.iterator(); iterator.hasNext();) {
			String str = (String) iterator.next();
			//System.out.println(" iterator value "+ str);
		}
		long end = System.currentTimeMillis();
		System.out.println(" Vector iterValue   :" + (end-start));
	}
	
	private static void forValue(){
		long start = System.currentTimeMillis();
		for (int i = 0; i < strings.size(); i++) {
			strings.get(i);
		}
		long end = System.currentTimeMillis();
		System.out.println(" Vector forValue   :" + (end-start));
	}

	
	
	public static void main(String[] args) {
		setValue();
		iterValue();
		forValue();
	}

}

実行結果は次のとおりです.
要素の数が1000000に設定された結果:
VectoriterValue消費時間:226
VectorforValue消費時間:438
要素の数が100000に設定された結果:
Vector iterValue消費時間:7
VectorforValue消費時間:5
まず、Vectorもリストの配列ベースの実装であり、ArrayListとは異なり、Vectorはスレッドが安全な可変配列である.
結果は、Vectorの要素を取得する際、結果1では、iteratorの方式が元のforサイクルの方式よりずっと速く、結果2では元のforサイクルがiteratorの方式より速く、スレッドが安全な環境では、データ量が大きすぎる場合、iteratorの方式が元のforサイクルの方式よりずっと効果的であることを示している.
ArrayListとVectorの結果を比較すると、データ量が同じ場合、どのようにしてもスレッドが安全でないものよりもはるかに遅い、
したがって,マルチスレッド環境でなければ,Vectorを用いずにArrayListまたはLinkedListを用いるのが適切であり,チェーンテーブルベースの実装であればiteratorを用いるのが好ましく,配列ベースの実装であれば元のforループを用いるのがよい.