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操作.