HashMapとHashtable分析
1.関係を引き継ぎましょう
Javaコード
public class Hashtable< k,v> extends Dictionary< k,v> implements Map< k,v>, Cloneable, java.io.Serializable {…} public class HashMap< k,v> extends AbstractMap< k,v> implements Map< k,v>, Cloneable, Serializable {…}
hashtableもMapインタフェースを継承していることがわかります.これらの違いは、Hashtable(since JDK 1.0)がDictionaryという抽象クラスを継承し、HashMap(since JDK 1.2)がAbstractMapという抽象クラスを継承することである.HashtableにおいてMapを継承することを見て実現する方法はJDK 1であるからである.2バージョンで追加されたため、JDK 1.2の開発時にSunエンジニアが統一的な考慮でHashtableもMapインタフェースを継承した可能性があります.
2.同期性と同時性の違いを説明します.
この2つのクラスのソースコードによって分析することができ、Hashtableの主な方法は同期処理されているが、HashMapにはない.Hashtableはデフォルトで同期をサポートしていますが、HashMapはデフォルトではサポートされていません.マルチスレッド同時環境ではHashtableを直接使用できるが,HashMapを使用するには自分で同期処理を増やす必要がある.HashMapの同期処理は、Collectionsクラスが提供するsynchronizedMap静的方法を使用することができる.またはJDK 5を直接使用する.0以降に提供されるjava.util.concurrentパッケージのConcurrentHashMapクラス.
3.null値の処理方法
Hashtableではkeyもvalueもnull値を許さないことがソースコードから分かる.
上記の方法を使用すると、パラメータvalueがnullのように、プログラムがNull PointerExceptionを投げ出すことがコードから直接わかります.keyがnullの場合、「int hash=key.hashCode();「このHash値の計算中にNull PointerExceptionを放出します.HashMapではnullをkeyとして存在させ、他のkeyの特性と同様にnull値keyは1つしかありません.またHashMapでは複数のvalueをnullとして許可します.HashMapではget(key)は使用できません.メソッドは、HashMapにキーが存在するかどうかを判断します.valueがnullであるか、そのキーが存在しないかのEntryはnull値を返し、containsKey()メソッドで判断する必要があります.
結果
4.hash値の取得方法
やはりソースコードソースコードを通して、Hashtableはkeyオブジェクトを直接使用するhash値です.
一方,HashMapはkeyオブジェクトのhash値を用いて新しいhash値を再計算する.
本文はネット上の1篇の比較的に面白い招待状の上から転載して来て、原文のリンク
http://www.java3z.com/cwbwebhome/article/article8/81437.html?id=4314
Javaコード
public class Hashtable< k,v> extends Dictionary< k,v> implements Map< k,v>, Cloneable, java.io.Serializable {…} public class HashMap< k,v> extends AbstractMap< k,v> implements Map< k,v>, Cloneable, Serializable {…}
hashtableもMapインタフェースを継承していることがわかります.これらの違いは、Hashtable(since JDK 1.0)がDictionaryという抽象クラスを継承し、HashMap(since JDK 1.2)がAbstractMapという抽象クラスを継承することである.HashtableにおいてMapを継承することを見て実現する方法はJDK 1であるからである.2バージョンで追加されたため、JDK 1.2の開発時にSunエンジニアが統一的な考慮でHashtableもMapインタフェースを継承した可能性があります.
2.同期性と同時性の違いを説明します.
この2つのクラスのソースコードによって分析することができ、Hashtableの主な方法は同期処理されているが、HashMapにはない.Hashtableはデフォルトで同期をサポートしていますが、HashMapはデフォルトではサポートされていません.マルチスレッド同時環境ではHashtableを直接使用できるが,HashMapを使用するには自分で同期処理を増やす必要がある.HashMapの同期処理は、Collectionsクラスが提供するsynchronizedMap静的方法を使用することができる.またはJDK 5を直接使用する.0以降に提供されるjava.util.concurrentパッケージのConcurrentHashMapクラス.
3.null値の処理方法
Hashtableではkeyもvalueもnull値を許さないことがソースコードから分かる.
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
// Makes sure the key is not already in the hashtable.
Entry tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
//… }
上記の方法を使用すると、パラメータvalueがnullのように、プログラムがNull PointerExceptionを投げ出すことがコードから直接わかります.keyがnullの場合、「int hash=key.hashCode();「このHash値の計算中にNull PointerExceptionを放出します.HashMapではnullをkeyとして存在させ、他のkeyの特性と同様にnull値keyは1つしかありません.またHashMapでは複数のvalueをnullとして許可します.HashMapではget(key)は使用できません.メソッドは、HashMapにキーが存在するかどうかを判断します.valueがnullであるか、そのキーが存在しないかのEntryはnull値を返し、containsKey()メソッドで判断する必要があります.
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public class TestCase {
public static void main(String[] args) {
Map< integer,string> hashMap = new HashMap< integer,string>();
hashMap.put(0, null);
hashMap.put(1, "one");
hashMap.put(2, "two");
hashMap.put(null, "null");
for(Entry< integer, string> e : hashMap.entrySet()) {
System.out.println("Key: " + e.getKey() + " -- Value: " + e.getValue());
}
System.out.println(hashMap.get(0));
System.out.println(hashMap.get(4));
System.out.println("Contains key 0 ? :" + hashMap.containsKey(0));
System.out.println("Contains key 4 ? :" + hashMap.containsKey(4));
System.out.println("Contains value null ? :" + hashMap.containsValue(null));
}
}
結果
Key: null -- Value: null
Key: 0 -- Value: null
Key: 1 -- Value: one
Key: 2 -- Value: two
null
null
Contains key 0 ? :true
Contains key 4 ? :false
Contains value null ? :true
4.hash値の取得方法
やはりソースコードソースコードを通して、Hashtableはkeyオブジェクトを直接使用するhash値です.
public synchronized V put(K key, V value) { // Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
// Makes sure the key is not already in the hashtable. Entry tab[] = table;
int hash = key.hashCode();//hashcode
int index = (hash & 0x7FFFFFFF) % tab.length;
//… }
一方,HashMapはkeyオブジェクトのhash値を用いて新しいhash値を再計算する.
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());//hashcode
int i = indexFor(hash, table.length);
//… }
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
本文はネット上の1篇の比較的に面白い招待状の上から転載して来て、原文のリンク
http://www.java3z.com/cwbwebhome/article/article8/81437.html?id=4314