JavaでのHashMapとHashtable

2686 ワード

[size=large]
転載先:http://www.cnblogs.com/devinzhang/archive/2012/01/13/2321481.html. いくつかの修正をしました.
1. HashMap
1)hashmapのデータ構造
Hashmapは配列とチェーンテーブルの結合体(データ構造では「チェーンテーブルハッシュ」と呼ばれる)であり、以下に示す.
Java中的HashMap和Hashtable
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]