看这个题目,又是一个面试题,大概五次面试,三次会被问到这个题目。我们前面一直在学习集合框架,最早的List到Set,再到现在的Map,我们都没有介绍Hashtable这个类。接下来,我们先了解下Hashtable的历史然后通过代码去记住两者的区别和共同点。
1.Hashtable API介绍
JAVA API 文档搜索Hashtable,下拉一点可以看到这段话“从Java2 平台 v1.2起,此类就被改进以实现 Map
接口,使它成为 JavaCollections Framework 中的一个成员。不像新的 collection 实现,Hashtable
是同步的”也就是说Hashtable是在java 1.0版本就出现了,而集合框架是在java 1.2版本出现。这个就有点像Vector,之前早就有,等出现集合框架就实现了List接口。上面还提到了Hashtable是同步的,也就是线程同步。这好比,Vector被ArrayList替代了,同样,Hashtable被HashMap替代。
2.二者的区别和共同点
共同点:
底层都是哈希算法实现,都是双列集合
区别:
1)HashMap是线程不安全的(不同步),效率高,是JDK 1.2版本开始
Hashtable是线程安全的(同步),效率低,是JDK1.0版本开始出现
2)HashMap可以存储null键和null值,Hashtable不可以存储null键和null值。
3.代码举例
下面分别来写HashMap存储键为null和值为null的情况。
package map;
import java.util.HashMap;
public class Demo1_Map {
public static void main(String[] args) {
HashMap<String, Integer> hm = new HashMap<>();
hm.put("张三", null);
hm.put(null, 24);
System.out.println(hm);
}
}
运行输出:
{null=24, 张三=null}
说明HashMap键可以为null,和值也可以为null。接下来看看Hashtable的情况。
package map;
import java.util.Hashtable;
public class Demo1_Hashtable {
public static void main(String[] args) {
Hashtable<String, Integer> ht = new Hashtable();
ht.put(null, 23);
ht.put("张三", null);
}
}
运行报空指针异常
Exception in thread "main" java.lang.NullPointerException
at java.util.Hashtable.put(Unknown Source)
at map.Demo1_Hashtable.main(Demo1_Hashtable.java:9)
所以,如果想在集合中可能存在null值的情况,还想继续执行集合存储之后的代码操作,那么就要选择HashMap来实现。Hashtable是会抛出异常,无法继续执行接下来的代码。版权声明:本文为u011541946原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。