JavaでのHashMapとHashtable
2686 ワード
[size=large]
転載先:http://www.cnblogs.com/devinzhang/archive/2012/01/13/2321481.html. いくつかの修正をしました.
1. HashMap
1)hashmapのデータ構造
Hashmapは配列とチェーンテーブルの結合体(データ構造では「チェーンテーブルハッシュ」と呼ばれる)であり、以下に示す.
hashmapにput要素を入力すると、keyのhashに基づいてこの要素の配列内の位置(すなわち下付き)に値し、その後、この要素を対応する位置に置くことができます.この要素が存在する位置に他の要素が格納されている場合、同じ位置にある要素はチェーンテーブルの形で格納され、新しく追加されたものはチェーンヘッドに配置され、最初に追加されたものはチェーンテールに配置されます.
2)使用
2.HashTableとHashMapの違い
第一に、継承が異なる.
public class Hashtable extends Dictionary implements Map
public class HashMap extends AbstractMap implements Map
Dictionaryクラスは時代遅れで、このような拡張ではなくMapインタフェースを実装する必要があります.Hashtableはjava 2にMapを導入して最適化したはずです.
2番目
Hashtableのメソッドは同期化され、HashMapのメソッドはデフォルトで非同期化されます.マルチスレッド同時環境ではHashtableを直接使用できるが,HashMapを使用するには自分で同期処理を増やす必要がある.
しかし、HashMapの同期問題はCollectionsの静的方法によって解決することができる.
Map Collections.synchronizedMap(Map m)
この方法は同期したMapを返し,このMapは下層のHashMapのすべての方法をカプセル化し,下層のHashMapがマルチスレッド環境においても安全であるようにした.
ConcurrentHashMapクラスも同様に使用できます.
3番目
Hashtableではkeyもvalueもnull値を許可しません.
HashMapではnullをキーとすることができ、このようなキーは1つしかありません.1つ以上のキーに対応する値nullを指定できます.get()メソッドがnull値を返すと、HashMapにそのキーがないことを示すこともできるし、そのキーに対応する値がnullであることを示すこともできる.したがって,HashMapではget()メソッドでHashMapにキーが存在するか否かを判断することはできず,containsKey()メソッドで判断すべきである.
第四に、2つの遍歴方式の内部実装が異なる.
Hashtable、HashMapともにIteratorを使用しています.歴史的な理由から、HashtableはEnumeration方式も使用しています.
5番目
ハッシュ値の使用は異なり,HashTableはオブジェクトのhashCodeを直接使用する.HashMapはhash値を再計算します.
6番目
HashtableとHashMapの2つの内部実装方式の配列の初期サイズと拡張方式.HashTableではhash配列のデフォルトサイズは11であり,増加はold*2+1である.HashMapにおけるhash配列のデフォルトサイズは16であり,必ず2の指数(ビット演算が容易)である.
[/size]
転載先:http://www.cnblogs.com/devinzhang/archive/2012/01/13/2321481.html. いくつかの修正をしました.
1. HashMap
1)hashmapのデータ構造
Hashmapは配列とチェーンテーブルの結合体(データ構造では「チェーンテーブルハッシュ」と呼ばれる)であり、以下に示す.
hashmapにput要素を入力すると、keyのhashに基づいてこの要素の配列内の位置(すなわち下付き)に値し、その後、この要素を対応する位置に置くことができます.この要素が存在する位置に他の要素が格納されている場合、同じ位置にある要素はチェーンテーブルの形で格納され、新しく追加されたものはチェーンヘッドに配置され、最初に追加されたものはチェーンテールに配置されます.
2)使用
@Test
public void testTraverse(){
Map<String,String> map = new HashMap<String,String>();
map.put("Rajib Sarma","100");
map.put("Rajib Sarma","200");//The value "100" is replaced by "200".
map.put("Sazid Ahmed","200");
Iterator<Map.Entry<String,String>> iter=map.entrySet().iterator();
while(iter.hasNext()){
Map.Entry<String, String> entry = iter.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println("key: "+key);
System.out.println("value: "+value);
}
}
2.HashTableとHashMapの違い
第一に、継承が異なる.
public class Hashtable extends Dictionary implements Map
public class HashMap extends AbstractMap implements Map
Dictionaryクラスは時代遅れで、このような拡張ではなくMapインタフェースを実装する必要があります.Hashtableはjava 2にMapを導入して最適化したはずです.
2番目
Hashtableのメソッドは同期化され、HashMapのメソッドはデフォルトで非同期化されます.マルチスレッド同時環境ではHashtableを直接使用できるが,HashMapを使用するには自分で同期処理を増やす必要がある.
しかし、HashMapの同期問題はCollectionsの静的方法によって解決することができる.
Map Collections.synchronizedMap(Map m)
この方法は同期したMapを返し,このMapは下層のHashMapのすべての方法をカプセル化し,下層のHashMapがマルチスレッド環境においても安全であるようにした.
ConcurrentHashMapクラスも同様に使用できます.
3番目
Hashtableではkeyもvalueもnull値を許可しません.
HashMapではnullをキーとすることができ、このようなキーは1つしかありません.1つ以上のキーに対応する値nullを指定できます.get()メソッドがnull値を返すと、HashMapにそのキーがないことを示すこともできるし、そのキーに対応する値がnullであることを示すこともできる.したがって,HashMapではget()メソッドでHashMapにキーが存在するか否かを判断することはできず,containsKey()メソッドで判断すべきである.
第四に、2つの遍歴方式の内部実装が異なる.
Hashtable、HashMapともにIteratorを使用しています.歴史的な理由から、HashtableはEnumeration方式も使用しています.
5番目
ハッシュ値の使用は異なり,HashTableはオブジェクトのhashCodeを直接使用する.HashMapはhash値を再計算します.
6番目
HashtableとHashMapの2つの内部実装方式の配列の初期サイズと拡張方式.HashTableではhash配列のデフォルトサイズは11であり,増加はold*2+1である.HashMapにおけるhash配列のデフォルトサイズは16であり,必ず2の指数(ビット演算が容易)である.
[/size]