HashMap和HashTable区别
1. HashMap:
HashMap实现了的是Map接口,非线性安全,效率相对高,是将键映射到值的对象,其中键和值都是对象,键是不能重复的,当然重复也不会编译运行错误,但是出现重复键时,后一个键的值会把前一个的键的值给覆盖,HashMap是允许出现null键和值的,但是多个null键会视为Key相同,对应的值也理所当然地被覆盖,HashMap提供了containskey和containsvalue方法查询键和值是否存在。
2. HashTable:
HashTable的父类是dictionary,线性安全,效率相对低,同样他也不允许键重复,相同会覆盖值,注意的是,HashTable是不允许键值对为null的,当然编译不会报错,但运行会报空指针异常,同样的HashTable也提供了containskey和containsvalue方法查询键和值是否存在,HashTable也提供了一个contains方法查询值是否存在(不懂它与containsValue的区别)。
小提示:
如果在多线程中访问HashTable时,是不需要为他实现同步方法的,而HashMap则要为它额外的实现synchronize方法。
代码块:
import java.util.HashMap;
import java.util.Hashtable;
public class Demo {
public static void main(String[] args) {
HashMap<Object, Object> hashmap = new HashMap<>();
hashmap.put("1", "1");
hashmap.put("1", "11");// 覆盖前一个的值
hashmap.put("2", null);// 编译、运行通过
hashmap.put(null, "11");// 同上
hashmap.put(null, "66");// 覆盖前一个的值
Hashtable<String, String> hashtable = new Hashtable<>();
hashtable.put("1", "10");
hashtable.put("1", "1111");// 覆盖前一个的值
hashtable.put("2", "33");
hashtable.put("3", "33");
// hashtable.put("4", null); //编译通过,运行报java.lang.NullPointerException
// hashtable.put(null, null); //同上
System.out.println("hashmap的size:" + hashmap.size());
System.out.println("hashtable的size:" + hashtable.size());
System.out.println("hashmap中键为null的值为:" + hashmap.get(null));
System.out.println(hashtable.get("1"));// 获取hashtable键为1的值,看是否覆盖
// 区别何在?
System.out.println(hashtable.contains("33"));
System.out.println(hashtable.containsValue("33"));
}
}
运行结果:
hashmap的size:3
hashtable的size:3
hashmap中键为null的值为:66
1111
true
true