通过程序把HashMap和Hashtable的区别记录一下,以便于以后忘记
一,HashMap和Hashtable都是不可以有重复的key,但是都可以有重复的value,
为什么会不能用重复的key呢,因为第二次put相同的key会把第一次覆盖掉,如下代码
import java.util.Vector;
public class JavaHash {
public static void main(String[] args) {
Hashtable ht = new Hashtable();
ht.put("A", "1");
ht.put("A", "2");
ht.put("B", "3");
ht.put("C", "3");
//ht.put(null, null);//①
//ht.put("D", null);//②
ht.put("", "");
System.out.println("Hashtable的长度为:"+ht.size());
System.out.println("Hashtable的所有key为:"+ht.keySet());
System.out.println("Hashtable中A的value为:"+ht.get("A"));
System.out.println("Hashtable中B的value为:"+ht.get("B"));
System.out.println("Hashtable中C的value为:"+ht.get("C"));
System.out.println("Hashtable中D的value为:"+ht.get("D"));
System.out.println(ht.containsKey("A"));
System.out.println(ht.containsValue("1"));
System.out.println(ht.contains("3"));
System.out.println("-----------------------------------");
HashMap hm = new HashMap();
hm.put("A", "1");
hm.put("A", "2");
hm.put("B", "3");
hm.put("C", "3");
hm.put(null, null);
hm.put("D", null);
hm.put("", "");
System.out.println("HashMap的长度为:"+hm.size());
System.out.println("HashMap的所有key为:"+hm.keySet());
System.out.println("HashMap中A的value为:"+hm.get("A"));
System.out.println("HashMap中B的value为:"+hm.get("B"));
System.out.println("HashMap中C的value为:"+hm.get("C"));
System.out.println("HashMap中D的value为:"+hm.get("D"));
System.out.println(hm.containsKey("A"));
System.out.println(hm.containsValue("1"));
}
}
运行结果为:
Hashtable的长度为:4
Hashtable的所有key为:[A, C, , B]
Hashtable中A的value为:2
Hashtable中B的value为:3
Hashtable中C的value为:3
Hashtable中D的value为:null
true
false
true
-----------------------------------
HashMap的长度为:6
HashMap的所有key为:[D, null, A, C, B, ]
HashMap中A的value为:2
HashMap中B的value为:3
HashMap中C的value为:3
HashMap中D的value为:null
true
false
通过运行结果发现,不论是Hashtable,还是HashMap中put两次key为A,最后都会是保存A最后一次值,所以两者都不会有重复key。
二,如果把上述代码中的①②两行添加上后,会报空指针,所以Hashtable中key和value都不能为空null。
而HashMap中不管是key还是value都可以为null,在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。
三,Hahstable和HashMap都提供了containsKey(key)和containsValue(value)方法
但Hashtable多一个contains(Object value),功能和containsValue(Object value)功能一样。
先把这三点不同写下来,关于线程同步的不同和其他不同点,还不太懂,以后搞通再整理