Util Collection s Continer Analysis in 2009


@Author:cjcj  [email protected]<c-j.itey.com>
メモ:
    私はまだ幼くて無知な子供の時、ネットに被害を与えました.
    ネットでは、List対象のIteratorが通常のforサイクルよりも効率が高いと噂されていましたが、今日はプロジェクト全体をIteratorに変更しました.しかし、一念の間に簡単なテストをして、はっと悟りました.また、LinkdListがOutOfMemoryErrエラーを発見しました.もっと迷いました.
 
Listインターフェース:
    現在、工程でよく使われているListはデータを記憶しています.その中で一番よく使われているのは、ArayListとLinkdListです.それを知っているという姿勢を持って、この二つのList容器を覗きます.
 
継承関係:
ArayListの継承関係は:
public class ArrayList extends AbstractList
implements List, RandomAccess, Cloneable, java.io.Serializable
 
見えます
implements List---Listインターフェースに関連しています.
Clone eable--clone方法のために使います.
Serializable--基本的には対象のシリアルを異地JVMで呼び出すために使用します.
 
Linked Listの継承関係は:
public class LinkedList extends AbstractSequentialList
          implements List, Cloneable, java.io.Serializable
 
implements List---Listインターフェースに関連しています.
 
保存形式:
ArayListは動的Object[]配列でデータを格納する.
   /**
     * The array buffer into which the elements of the ArrayList are stored.
     * The capacity of the ArrayList is the length of this array buffer.
     */
    private transient Object elementData[];
初期値の操作は以下の通りです.
this.elementData = new Object[initialCapacity];
JDK 1.6にあります で、この配列初期化は10の大きさ、つまりnew Object[10];
 
add()の値付けは、次のように動作します.
データを追加すると、ArayListは  (現在のサイズ*3)/2+1のインクリメントで記憶ブロックを追加します.
 
 public void ensureCapacity(int minCapacity) {
	modCount++;
	int oldCapacity = elementData.length;
	if (minCapacity > oldCapacity) {
	    Object oldData[] = elementData;
	    int newCapacity = (oldCapacity * 3)/2 + 1;
    	    if (newCapacity < minCapacity)
		newCapacity = minCapacity;
	    elementData = new Object[newCapacity];
	    System.arraycopy(oldData, 0, elementData, 0, size);
	}
    }
Linked Listはプライベートクラスのprvate static class Entryでデータを格納します.
private transient Entry header = new Entry(null, null, null);
初期化時、彼女のサイズは0です.
add()の値付けは、次のように動作します.
 private Entry addBefore(Object o, Entry e) {
	Entry newEntry = new Entry(o, e, e.previous);
	newEntry.previous.next = newEntry;
	newEntry.next.previous = newEntry;
	size++;
	modCount++;
	return newEntry;
    }
双方向チェーンのようにデータを追加します.だから彼の記憶している各部門の支出はArayListより大きいです.
 
テストコード:
List list=new LinkedList();
		for(int i=0 ;i<3000000;++i){
		list.add("tesing--cjcj");
		}	
		long now=System.currentTimeMillis();
		Iterator iter=list.iterator();
		while(iter.hasNext()){
			Object obj=iter.next();
		}
		System.out.println(System.currentTimeMillis()-now);
		now = System.currentTimeMillis();
		for(int i =0;i<list.size();++i){
			Object obj=list.get(i);
		}
		System.out.println(System.currentTimeMillis()-now);
 
テスト結果:
Exception in thread「main」java.lang.OutOfMemoryErr:Java heap space
ArayListを使うとメモリオーバーが発生しません.
 
 
 
大体の結論:
 ArayList用のデータ構造はforが一番早いです.記憶容量もLinkdListより大きいです.後からデータを追加したり削除したりして、ランダムに調べます.
 Linked ListはIteratorを使ってforより速いです.ランダムにデータを増やすのに適しています.
 
1.HashTableの方法は同期であり、HashMapは同期されていないので、マルチスレッドの場合は手動でHashMapを同期させるという違いはVectorとarrayListのようです.
2.HashTableはnull値(keyもvalueも不可)を許さず、HashMapはnull値(keyもvalueも可)を許可します.
3.HashTableにはcontainsがあり、機能はcontainsValueと同じです.
4.HashTableはEnumerationを使用し、HashMapはIteratorを使用する.