文档章节

Java中HashMap和HashTable区别

Panshuyang
 Panshuyang
发布于 2016/03/23 10:18
字数 667
阅读 240
收藏 8

        前几天被一家公司电面的时候被问到HashMap和HashTable的区别,当时就懵逼了,hashTable是个啥?从来没用过啊,于是电面完之后马上google了一把,这回涨姿势了;

        HashMap和HashTable同属于Java.util包下的集合类,Hashtable是个过时的集合类,存在于Java API中很久了。在Java 4中被重写了,实现了Map接口,所以自此以后也成了Java集合框架中的一部分。

        HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。

对比项 HashMap HashTable
是否线程安全
是否synchronized
是否支持多线程共享 在有正确的同步机制的前提下可以支持多线程共享 支持
单线程效率
只随时间推移元素次序是否不变 不一定
是否支持null的key和value 支持 不支持



        另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。

        Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。同时HashMap也可以通过以下方式进行同步操作,返回的Map就是一个

HashMap<String, String> hashMap = new HashMap<String, String>();
Map map = Collections.synchronizedMap(hashMap);
*****synchronizedMap的方法API描述*****
Returns a synchronized (thread-safe) map backed by the specified map. In order 
to guarantee serial access, it is critical that all access to 
the backing map is accomplished through the returned map.It is imperative that the user manually synchronize on the returned map when 
iterating over any of its collection views:
  Map m = Collections.synchronizedMap(new HashMap());
      ...
  Set s = m.keySet();  // Needn't be in synchronized block
      ...
  synchronized(m) {  // Synchronizing on m, not s!
      Iterator i = s.iterator(); // Must be in synchronized block
      while (i.hasNext())
          foo(i.next());
  } 
Failure to follow this advice may result in non-deterministic behavior.The returned map will be serializable if the specified map is serializable.
Parameters:
m the map to be "wrapped" in a synchronized map.
Returns:
a synchronized view of the specified map.

        一般的话仅在需要 完全的线程安全的时候使用Hashtable,而如果你使用Java 5或以上的话,请使用ConcurrentHashMap代替HashTable;

© 著作权归作者所有

Panshuyang
粉丝 0
博文 12
码字总数 6017
作品 0
武汉
私信 提问
HashMap和Hashtable的区别

HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题。HashMap的工作原理、ArrayList与Vector的比较以及这个问...

LCZ777
2014/03/29
95
0
Hashtable 为什么不叫 HashTable?

前几天在写《HashMap 和 Hashtable 的 6 个区别》这篇文章的时候,差点把 Hashtable 写成了 HashTable,后来看源码证实了是:Hashtable,小写的 "t"able,不符合驼峰命名规则。 什么是驼峰命...

Java技术栈
2018/12/10
50
1
HashMap 和 Hashtable 的 6 个区别,最后一个没几个人知道!

HashMap 和 Hashtable 是 Java 开发程序员必须要掌握的,也是在各种 Java 面试场合中必须会问到的。 但你对这两者的区别了解有多少呢? 现在,栈长我给大家总结一下,或许有你不明朗的地方,...

Java技术栈
2018/12/05
38
0
Hashtable 和 HashMap 的区别

类定义 这个从源码中可以直接看出来,HashMap 继承自 AbstractMap,而 Hashtabl 继承自 Dictionary。 2. 线程安全性 Hashtable 在很多方法定义时都会加上 关键字,说明 Hashtabl 是线程安全的...

firepation
2018/08/09
13
0
周末去面试,进去 5 分钟就出来了…

你们可能会想,栈长这么菜的吗?5分钟都坚持不了? 本文说起来会有点尴尬,毕竟这是栈长我曾经经历过的故事。。。 那时候的栈长还真菜,每天写着 if/ for 及一些简单的业务逻辑代码,虽工作有...

Java技术栈
2018/12/17
229
0

没有更多内容

加载失败,请刷新页面

加载更多

Redis集群搭建

服务器资源 ip 账号 配置 操作系统 xxx.70 root/xxx 磁盘50G(/)+150G(/home)、内存16G、CPU 16core CentOS Linux release 7.2.1511 (Core) xxx.74 root/xxx 磁盘50G(/)+150G(/home)、......

jxlgzwh
32分钟前
5
0
avro

一、 ```我们已经接触过很多序列化框架(或者集成系统),比如protobuf、hessian、thrift等,它们各有优缺点以及各自的实用场景,Avro也是一个序列化框架,它的设计思想、编程模式都和thi...

hexiaoming123
33分钟前
6
0
QML TextInput的字体超出控件范围

本文链接:https://blog.csdn.net/chyuanrufeng/article/details/54691998 问题描述 :QML TextInput输入内容超过TextInput的大小 当输入过多的字符串时,会出现内容超过TextInput的大小,字...

shzwork
35分钟前
4
0
《Java 8 in Action》Chapter 10:用Optional取代null

1965年,英国一位名为Tony Hoare的计算机科学家在设计ALGOL W语言时提出了null引用的想法。ALGOL W是第一批在堆上分配记录的类型语言之一。Hoare选择null引用这种方式,“只是因为这种方法实...

HelloDeveloper
36分钟前
4
0
进击的 Java ,云原生时代的蜕变

作者| 易立 阿里云资深技术专家<br /> <br />导读:云原生时代的来临,与Java 开发者到底有什么联系?有人说,云原生压根不是为了 Java 存在的。然而,本文的作者却认为云原生时代,Java 依然...

阿里巴巴云原生
38分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部