Java集合框架篇-72-HashMap和Hashtable的区别

       看这个题目,又是一个面试题,大概五次面试,三次会被问到这个题目。我们前面一直在学习集合框架,最早的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是会抛出异常,无法继续执行接下来的代码。

猜你喜欢

转载自blog.csdn.net/u011541946/article/details/80602299