Hashtable的应用非常广泛,HashMap是新框架中用来代替Hashtable的类,也就是说建议使用HashMap,不要使用Hashtable。可能你觉得Hashtable很好用,为什么不用呢?这里简单分析他们的区别。
1.Hashtable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。
查看Hashtable的源代码就可以发现,除构造函数外,Hashtable的所有 public 方法声明中都有 synchronized 关键字,而HashMap的源代码中则连 synchronized 的影子都没有,当然,注释除外。
2.Hashtable不允许 null 值(key 和 value 都不可以),HashMap允许 null 值(key和value都可以,但是key只能有一个为空)。
3,关于两者的遍历方式大同小异,Hashtable仅仅比HashMap多一个elements方法。
/**a test for Hashtable values can or not be null**/
public class Test {
public static void main(String[]args){
Hashtable<String,String> table=new Hashtable<String,String>();
table.put("a-key","a-values");
table.put("b-key","b-values");
table.put("c-key","c-values");
//table.put("d-key",null);//java.lang.NullPointerException
//System.out.print(table);
/**用values的方式遍历**/
Collection zzy=table.values();
Iterator it=zzy.iterator();
while(it.hasNext()){
String obj=(String)it.next();
System.out.println(obj);
}
/**用entrySet的方式遍历**/
Set set = table.entrySet();
Iterator its = set.iterator();
while (its.hasNext()) {
Entry entry = (Entry) its.next();
System.out.println(entry.getKey() + " - " + entry.getValue());
}
}
}
/**a test for HashMap values can or not be null**/
public class Test1 {
public static void main(String[]args){
HashMap<String,String> table=new HashMap<String,String>();
table.put("a-key","a-values");
table.put("b-key","b-values");
table.put("c-key","c-values");
table.put(null,null);
table.put("d-key",null);//java.lang.NullPointerException
//System.out.print(table);
/**用values的方式遍历**/
Collection zzy=table.values();
Iterator it=zzy.iterator();
while(it.hasNext()){
String obj=(String)it.next();
System.out.println(obj);
}
/**用entrySet的方式遍历**/
Set set = table.entrySet();
Iterator its = set.iterator();
while (its.hasNext()) {
Entry entry = (Entry) its.next();
System.out.println(entry.getKey() + " - " + entry.getValue());
}
}
}
4.HashTable使用Enumeration,HashMap使用Iterator
以下这两点是从内部实现机制上来进行比较
5.哈希值的使用不同
6.Hashtable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。