ArrayListとHashMapの比較

3347 ワード

ArrayListとHashMapはJavaプロジェクト開発でよく使われるコンテナですが、両者の違いを比較してみましょう!
例:
//ArrayList
ArrayList array = new ArrayList();
array.add("  ");
array.add("  ");
array.add("  ");
System.out.println("ArrayList      :"+array.size());

//     :     Iterator     
Iterator iter = array.iterator();  
while(iter.hasNext()){  
    String name = (String)iter.next();  
    System.out.println(name); 
}
//     :  for    
for(int i=0;i

//HashMap
HashMap hashMap = new HashMap();
hashMap.put("name", "  ");
hashMap.put("name1", "  ");
hashMap.put("name2", "  ");
System.out.println("HashMap      :"+hashMap.size());

//     :hashMap.entrySet()  ,     Iterator        ,    
Iterator iter1 = hashMap.entrySet().iterator();  
while(iter1.hasNext()){  
    Map.Entry name = (Map.Entry)iter1.next();  
    String nameKey = (String)name.getKey();  
    String nameValue = (String)name.getValue();  
    System.out.println(nameKey + "'s name is " + nameValue);
}

//     :hashMap.keySet()  ,     Iterator        ,     
Iterator iter2 = hashMap.keySet().iterator();
while (iter2.hasNext()) {
    Object key = iter.next();
    Object val = hashMap.get(key);
}

//     :foreach     keyset,          
Set keySet = hashMap.keySet();
for(Object key: keySet) {
    System.out.print("[key=" + key + ",value=" + hashMap.get(key) + "]  ");
}

//     :java8     forEach。
hashMap.forEach((key,value) -> {
    System.out.print("[key=" + key + ",value=" + value + "]  ");
});

同じ点:
    1)いずれもスレッドが安全ではなく、同期していない
    2)null値を格納できる
    3)取得要素個数メソッドと同様にsize()メソッドで取得する
違い:
    1)実装インタフェース
    ArrayListはListインタフェース(Collection(インタフェース)->List(インタフェース)->ArrayList(クラス))を実現し、下位層は配列を使用する.一方,HashMapにはMapインタフェース(Map(インタフェース)->HashMap(クラス))が現れ,下位層ではHashアルゴリズムを用いてデータを格納している.
    2)ストレージ要素
    ArrayListは配列でデータを格納し、中の要素は順序があり、繰り返すことができる.一方、HashMapはデータをキー値ペアで格納し、キーのhashCode(hashCode)は同じではなく、同じ後ろの値は前の値を上書きし、値は繰り返すことができ、中の要素は無秩序である.
    3)要素を追加する方法
    ArrayListはadd(Object object)メソッドで要素を追加し、HashMapはput(Object key,Object value)で要素を追加します.
    4)デフォルトのサイズと拡張
    Java 7では、ArrayListのデフォルトサイズは10要素、HashMapのデフォルトサイズは16要素(2のべき乗でなければならない)です.
//ARrayListソースコード
 /**
  * Default initial capacity.
  */
 private static final int DEFAULT_CAPACITY = 10;

//HashMapソース
 /**
  * The default initial capacity - MUST be a power of two.
  */
 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

    ArrayList拡張増分:元容量の0.5倍+1、例えばArrayListの容量は10、一度の拡張後は容量は16;
    HashMap拡張増分:原容量の1倍、ロードファクタ0.75:即ち元素個数が容量長の0.75倍を超える場合、HashSetの容量が16、一次拡張後容量が32
シーンを使用:
エレメントへの高速ランダムアクセスが必要な場合は、ArrayListを使用します.キー値ペア形式のデータが必要な場合は、HashMapを使用します.
補足内容:
ロードファクタとは、Hash表の要素が満たされている程度を表します.ロードファクタが大きいほど、満たされている要素が多くなると、利点は空間利用率が高くなりますが、衝突の機会が大きくなります.逆に、ロードファクタが小さいほど、満たされている要素が少なくなり、衝突の機会が少なくなりますが、空間の浪費が多くなります.衝突の機会が大きいほど、検索のコストが高くなります.逆に、検索のコストが小さくなります.したがって、検索時間は小さくなります.そのため、「衝突の機会」と「空間利用率」の間にバランスとトレードオフを探さなければなりません.このバランスとトレードオフは本質的にデータ構造で有名な「時-空」の矛盾のバランスとトレードオフです.要素の個数が容量長*ロード係数を超えると、拡張されます.
もし書くのが間違っているならば、大神が多く指導することを望んで、弟に修正させて、感謝します!