转载:https://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&mid=2247487842&idx=1&sn=9974be8f5d9b0ba8ffe3724a887e9613&chksm=eb539454dc241d42258faccf3f0d98a97a508e9b5cde9b6af318b0365ed49173a8b2c997b6d4&scene=21#wechat_redirect

生动有趣的文章:哈希表哪家强?几大编程语言吵起来了!

好文章:面试28k职位,老乡面试官从HashCode到HashMap给我讲了一下午!「回家赶忙整理出1.6万字的面试材料」

【面试题】HashMap 面试 21 问

HashMap 和 Hashtable 是 Java 开发程序员必须要掌握的,也是在各种 Java 面试场合中必须会问到的。

但你对这两者的区别了解有多少呢?

现在,栈长我给大家总结一下,或许有你不明朗的地方,在栈长的指点下都会拨开迷雾见晴天。

1、线程安全

Hashtable 是线程安全的,HashMap 不是线程安全的。

为什么说 HashTable 是线程安全的?

来看下 Hashtable 的源码,Hashtable 所有的元素操作都是 synchronized 修饰的,而 HashMap 并没有。

public synchronized V put(K key, V value);
public synchronized V get(Object key);
...

2、性能优劣

既然 Hashtable 是线程安全的,每个方法都要阻塞其他线程,所以 Hashtable 性能较差,HashMap 性能较好,使用更广。

如果要线程安全又要保证性能,建议使用 JUC 包下的 ConcurrentHashMap。

3、NULL

Hashtable 是不允许键或值为 null 的,HashMap 的键值则都可以为 null。

那么问题来了,为什么 Hashtable 是不允许 KEY 和 VALUE 为 null, 而 HashMap 则可以?

Hashtable put 方法逻辑:

 public synchronized V put(K key, V value) {// Make sure the value is not nullif (value == null) {throw new NullPointerException();}// Makes sure the key is not already in the hashtable.Entry<?,?> tab[] = table;int hash = key.hashCode();...}

HashMap hash 方法逻辑:

static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

可以看出 Hashtable key 为 null 会直接抛出空指针异常,value 为 null 手动抛出空指针异常,而 HashMap 的逻辑对 null 作了特殊处理。

4、实现方式

Hashtable 的继承源码:

public class Hashtable<K,V>extends Dictionary<K,V>implements Map<K,V>, Cloneable, java.io.Serializable
HashMap 的继承源码:public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable

可以看出两者继承的类不一样,Hashtable 继承了 Dictionary类,而 HashMap 继承的是 AbstractMap 类。

Dictionary 是 JDK 1.0 添加的,貌似没人用过这个,栈长我也没用过。。

5、容量扩容

HashMap 的初始容量为:16,Hashtable 初始容量为:11,两者的负载因子默认都是:0.75。

/*** Constructs a new, empty hashtable with a default initial capacity (11)* and load factor (0.75).*/
public Hashtable() {this(11, 0.75f);
}/*** Constructs an empty <tt>HashMap</tt> with the default initial capacity* (16) and the default load factor (0.75).*/
public HashMap() {this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}

当现有容量大于总容量 * 负载因子时,HashMap 扩容规则为当前容量翻倍,Hashtable 扩容规则为当前容量翻倍 + 1。

6、迭代器

HashMap 中的 Iterator 迭代器是 fail-fast 的,而 Hashtable 的 Enumerator 不是 fail-fast 的。

所以,当其他线程改变了HashMap 的结构,如:增加、删除元素,将会抛出 ConcurrentModificationException 异常,而 Hashtable 则不会。

可以来看下这个区别的演示:

/**
* 微信公众号:Java技术栈
**/
public static void main(String[] args) {Map<String, String> hashtable = new Hashtable<>();hashtable.put("t1", "1");hashtable.put("t2", "2");hashtable.put("t3", "3");Enumeration<Map.Entry<String, String>> iterator1 = (Enumeration<Map.Entry<String, String>>) hashtable.entrySet().iterator();hashtable.remove(iterator1.nextElement().getKey());while (iterator1.hasMoreElements()) {System.out.println(iterator1.nextElement());}Map<String, String> hashMap = new HashMap<>();hashMap.put("h1", "1");hashMap.put("h2", "2");hashMap.put("h3", "3");Iterator<Map.Entry<String, String>> iterator2 = hashMap.entrySet().iterator();hashMap.remove(iterator2.next().getKey());while (iterator2.hasNext()) {System.out.println(iterator2.next());}}
输出信息:t2=2
t1=1
Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)at java.util.HashMap$EntryIterator.next(HashMap.java:1476)at java.util.HashMap$EntryIterator.next(HashMap.java:1474)at cn.javastack.Test.main(Test.java:37)

看到了吧?

所以,这条同样也是 Enumeration 和 Iterator 的区别。

最后一点有几个人知道?知道的请点赞回应一下,栈长粉丝数万,我就看看有几个人知道。。。

【Java】HashMap 和 Hashtable 的 6 个区别相关推荐

  1. Java HashMap与Hashtable数据结构和特点+HashSet简述

    Java HashMap与Hashtable数据结构和特点+HashSet简述 1.HashMap HashMap就是基于数组和链表的数据结构:JDK1.7使用 数组+单向链表:JDK1.8使用 数组 ...

  2. java HashMap 与HashTable的区别

    HashMap 与HashTable的区别 HashMap与Hashtable的区别是面试中经常遇到的一个问题.这个问题看似简单,但如果深究进去,也能了解到不少知识.本文对两者从来源,特性,算法等多个 ...

  3. Java HashMap和Hashtable的区别

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable ...

  4. HashMap 和 Hashtable 的 6 个区别,最后一个没几个人知道!

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

  5. 3、HashMap、HashTable和ConcurrentHashMap的区别?

    HashMap和HashTable的区别一种比较简单的回答是: (1)HashMap是非线程安全的,HashTable是线程安全的. (2)HashMap的键和值都允许有null存在,而HashTab ...

  6. HashMap、HashTable和ConcurrentHashMap的区别?

    HashMap和HashTable的区别一种比较简单的回答是: (1)HashMap是非线程安全的,HashTable是线程安全的. (2)HashMap的键和值都允许有null存在,而HashTab ...

  7. ArrayList与LinkedList、Vector的区别 HashMap与HashTable、HashSet的区别

    一.ArrayList 和 LinkedList区别: (1)两者都是线程不安全,都实现了Collection接口. (2)数据结构:ArrayList是基于动态数组的数据结构,LinkedList是 ...

  8. HashMap、HashTable和ConcurrentHashMap的区别

    HahMap.HashTable和ConcurrentHashMap的区别: HashMap HashTable ConcurrentHashMap null键 允许 不允许 不允许 null值 允许 ...

  9. HashMap和Hashtable及HashSet的区别

    Hashtable类     Hashtable继承Map接口,实现一个key-value映射的哈希表.任何非空(non-null)的对象都可作为key或者value.     添加数据使用put(k ...

最新文章

  1. 存储过程mysql into select into_mysql 存储过程select into select into select的搜索结果-阿里云开发者社区...
  2. MyBatis Mapper 文件例子
  3. 10个利用Eclipse调试Java的常见技巧
  4. C++11语言新特性-《C++标准库(第二版)》读书笔记
  5. Android动画效果-更新中
  6. Java获取当前时间,并转化为String类型
  7. 四、WebApp 基础可视组件(IVX 快速开发教程)
  8. neo4jcypher基本语句
  9. 问题 D: 自动拨出电话的程序
  10. worker进程和task进程区别_swoole中使用task进程异步的处理耗时任务
  11. python语言开发环境搭建_Python开发环境搭建-Go语言中文社区
  12. 2013.05.09
  13. LinkLib例子之十五:本地文件回放,支持暂停,seek等
  14. docker tomcat 多开 实例_Docker 快速验证 tomcat 单机多实例方案
  15. 腾讯云服务器安全组配置
  16. u盘恢复软件?windows小工具不要错过!
  17. 机器学习所需要的高数知识
  18. 关于HAL中的__weak详解
  19. 新版chrome浏览器字体编码插件Charset v0.5.5
  20. Learning from Synthetic Data: Addressing Domain Shift for Semantic Segmentation

热门文章

  1. 经济学家建议茅台国外售价为国内2倍:未来最有可能走向世界的奢侈品牌
  2. 微软将发布新版Win10 可能以“新 Windows”之名公布
  3. 华为P50 Pro最新渲染图曝光:后置造型有点奇怪
  4. 博纳影业IPO即将过会 阿里、腾讯均为股东
  5. 《和平精英》崩了 官方回应:受运营商网络波动影响 正在修复
  6. 魅族17系列邀请函来了:防爆盾外观实锤 或4月15日亮相
  7. iPad加价抢购,iPhone 11面临缺货,苹果的供应链困局来了
  8. 是什么让支付宝网络诈骗案占比逐渐下降?
  9. 魅族16T官网开启预约:骁龙855+4400mAh大电池
  10. 携程签约日本爱知县 探索主题游促中日交流