HashMap TreeMapの違い



public class HashMapTest {
	public static void main(String[] args){
		HashMap<_Student_,Integer> hm = new HashMap<_Student_,Integer>();
		hm.put(new _Student_(1,"langhua"),1);
		hm.put(new _Student_(1,"langhua"),1);
		System.out.println(hm.size());
		TreeMap<_Student_,_Student_> tm = new TreeMap<_Student_,_Student_>();
		tm.put(new _Student_(3,"langhua"),new _Student_(1,"langhua"));
		tm.put(new _Student_(2,"langhua"),new _Student_(2,"langhua"));
		System.out.println(tm.size());
		Iterator<Entry<_Student_, _Student_>> it = tm.entrySet().iterator();	
		while(it.hasNext()){
			Entry<_Student_, _Student_> en = it.next();
			System.out.println(en.getKey());
			System.out.println(en.getValue());
		}
//		 TreeMap K Comparable 
//		 HashMap ,K equals,hashCode 
//		 K 
//		Map entrySet()   Set<Map.Entry<K,V>>
//		keySet()   Set<K> 
//		values()  Collection<V> 
//		Map.Entry , getKey(),getValue() , K,V
	}
}
class _Student_ implements Comparable{
	int num;
	String name;
	
	public _Student_(int num,String name){
		this.num = num;
		this.name = name;
	}
	
	public String toString(){
		return num+":"+name;
	}
	
	public boolean equals(Object obj) {
		_Student_ s = (_Student_) obj;
		return num==s.num && name.equals(s.name);
	}

	public int hashCode() {
		return num*name.hashCode();
	}
	
	public int compareTo(Object o) {
		_Student_ s = (_Student_) o;
		int results = num > s.num ? 1 : (num ==s.num ? 0 : -1);
		if(results==0){
			return name.compareTo(s.name);
		}
		return results;
	}
	

}

参照
HashTableの応用は非常に広く、HashMapは新しいフレームワークでHashTableの代わりに使用されるクラスであり、つまりHashMapを使用することを推奨し、HashTableを使用しないことを推奨する.HashTableは使いやすいと思うかもしれませんが、なぜ使わないのですか?ここでは彼らの違いを簡単に分析します.
1.HashTableの方法は同期されており、HashMapは同期されていないので、マルチスレッドの場合にHashMapを手動で同期させるという違いは、VectorとArrayListのようなものです.
2.HashTableはnull値を許可しない(keyもvalueもできない)、HashMapはnull値を許可する(keyもvalueもできる).
3.HashTableにはcontains(Object value)があり、containsValue(Object value)と同じ機能があります.
4.HashTableはEnumeration、HashMapはIteratorを使用します.
以上は表面の違いにすぎず,それらの実現にも大きな違いがある.
5.HashTableのhash配列のデフォルトサイズは11で、old*2+1で増加します.HashMapにおけるhash配列のデフォルトサイズは16であり,必ず2の指数である.
6.ハッシュ値の使用が異なり、HashTableはオブジェクトのhashCodeを直接使用し、コードは次のようになります.
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
一方、HashMapはhash値を再計算し、代わりにモデルを求める.
int hash = hash(k);
int i = indexFor(hash, table.length);
static int hash(Object x) {
  int h = x.hashCode();
  h += ~(h << 9);
  h ^= (h >>> 14);
  h += (h << 4);
  h ^= (h >>> 10);
  return h;
}
static int indexFor(int h, int length) {
  return h & (length-1);
}
以上はいくつかの比較的に際立った違いにすぎません.もちろん、彼らの実現には多くの違いがあります.例えば、
HashMapのnull操作.