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の継承関係は:
見えます
implements List---Listインターフェースに関連しています.
Clone eable--clone方法のために使います.
Serializable--基本的には対象のシリアルを異地JVMで呼び出すために使用します.
Linked Listの継承関係は:
implements List---Listインターフェースに関連しています.
保存形式:
ArayListは動的Object[]配列でデータを格納する.
add()の値付けは、次のように動作します.
データを追加すると、ArayListは (現在のサイズ*3)/2+1のインクリメントで記憶ブロックを追加します.
add()の値付けは、次のように動作します.
テストコード:
テスト結果:
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を使用する.
メモ:
私はまだ幼くて無知な子供の時、ネットに被害を与えました.
ネットでは、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を使用する.