うさぎ組

ソフトウェア開発、チームによる製品開発、アジャイル、ソフトウェアテスト

Listはオブジェクトの配列です

JavaではListにプリミティブ型を保持することは出来ません。
これはListの実装がObjectの配列を保持するようになっているから。

なのでプリミティブ型をListに保持したいときは
値をラップオブジェクトに入れて保持させることになります。

Java 1.4までなら

・Listに追加するとき

	List list = new ArrayList();
	for(int i=0; i<10; i++)
		list.add(new Integer(i));

・Listから取得するとき

	int[] intArray = new int[list.size()];
	for(int i=0; i<list.size(); i++)
		intArray[i] = ((Integer)list.get(i)).intValue();

Java 1.5からはオートボクシング、オートアンボクシングという機能が実装されたので

・Listに追加するとき

	List<Integer> list = new ArrayList<Integer>();
	for(int i=0; i<10; i++)
		list.add(i);

・Listから取得するとき

	int[] intArray = new int[list.size()];
	for(int i=0; i<list.size(); i++)
		intArray[i] = list.get(i);

という感じ。
Java1.5からはコンパイル時に自動でラッパーオブジェクトとプリミティブ変換の処理が追加されます。
コンパイル時にJava1.4までのコーディングみたいなことをやってくれています。)


で、Listにintやらcharやら保持したいけど、
IntegerやらCharacterなどの機能は要らないっていうときがたまにあります。

機能要らないけど、ラップしなくちゃいけない・ラップされてしまうし、
要素の数が多くなるとパフォーマンスに影響があるんじゃないだろうかと不安になりました。

そこで、
プリミティブ型の値を保持するだけのラップオブジェクトでListに保持したときに
Java APIのラッパーオブジェクトで保持したときと
どれくらいの時間差がでるのかを測定してみました。
ついでにListではなく配列の場合も測定してみました。


【結果】



やはり単なるラップオブジェクトにしたところでほとんど差がありませんね。
そういう意味ではIntegerを独自に拡張したオブジェクトであってもあまり遅くならなさそうですね。





ちなみにテストコード↓


【テストコード】

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
 
 
public class Main{
    //要素数
    private static final int size = 1000000;
 
    public static void main(String[] args){
        for(int i=0; i<10; i++){
            long start = Calendar.getInstance().getTimeInMillis();
            //測定したいメソッド
            getWrapperList();
            long end = Calendar.getInstance().getTimeInMillis();
            System.out.println((end-start));
        }
    }
 
    private static List<Integer> getIntegerList(){
        List<Integer> list = new ArrayList<Integer>(size*2);
        for(int i=0; i<size; i++)
            list.add(i);
        return list;
    }
 
    private static List<IntWrapper> getWrapperList(){
        List<IntWrapper> list = new ArrayList<IntWrapper>(size*2);
        for(int i=0; i<size; i++)
            list.add(new IntWrapper(i));
        return list;
    }
 
    private static int[] getArray(){
        int[] intArray = new int[size];
        for(int i=0; i<size; i++)
            intArray[i] = i;
        return intArray;
    }
 
    static class IntWrapper{
 
        private final int value;
 
        public IntWrapper(int value){
            this.value = value;
        }
 
        public int getValue(){
            return value;
        }
    }
}