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