摘要:从源码、特性和算法实现等几个角度归纳HashMap和Hashtable的区别和联系。

  HashMap与Hashtable的区别是面试中经常遇到的一个问题。此问题看似简单,但如若深挖,也可以学习到很多底层知识。本文对两者从源码、特性和算法实现等几个角度进行归纳总结,力争多角度、全方位的立体式展示二者的区别和联系,帮助各位应聘者在面试时飙车不飘车,把面试官摁在地上摩擦。

  相同点

  • 都是以key-value键值对的形式存储数据;
  • 都实现了Serializable接口,故支持序列化;
  • 都实现了Cloneable接口,故能被克隆;
  • 都实现了Map接口。

  各自实现的接口如下图所示:

  不同点比较多,归纳为以下几点:

  对Null key 和Null value的支持不同。HashMap允许Key-value为null,Hashtable不允许;

  hash值算法不同。HashMap添加元素时,是使用自定义的哈希算法,而Hashtable直接采用key的hashCode();

  底层数据结构不同。HashMap 自jdk8开始,底层数据结构采用数组+链表+红黑树,而Hashtable采用数组+链表;

  线程安全性不一样。HashMap没有考虑同步,是线程不安全的。Hashtable是线程安全的,给api套上了一层synchronized修饰;

  虽然HashMap不是线程安全的,但是它的效率会好于Hashtable。这样别出心裁的设计是合理的,在日常应用中,大部分场景是单线程操作的。HashMap把这部分操作解放出来了。

  初始容量和扩容方式不一样。HashMap默认的初试容量大小是16;扩容时,每次将容量变为“原始容量x2”。Hashtable默认的容量大小是11;扩容时,每次将容量变为“原始容量x2 + 1”;

  另外,无论我们指定的容量为多少,构造方法都会将HashMap实际容量设为不小于指定容量的2的次方的一个数,且最大容量不能超过2的30次方。

  继承的父类不同。HashMap继承于AbstractMap类,Hashtable继承自Dictionary类;不过,Dictionary类是一个已经被废弃的类,父类都被废弃,自然而然也没人用它的子类Hashtable了。

  对外提供的接口不同。Hashtable比HashMap多提供了elments() 和contains() 两个方法。

  迭代器(Iterator)不同。HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException。

面试题:HashMap和Hashtable的区别和联系的更多相关文章

  1. 面试题·HashMap和Hashtable的区别(转载再整理)

    原文链接: Javarevisited 翻译: ImportNew.com- 唐小娟 译文链接: http://www.importnew.com/7010.html HashMap和Hashtabl ...

  2. java面试题——HashMap和Hashtable 的区别

    一.HashMap 和Hashtable 的区别 我们先看2个类的定义 public class Hashtable extends Dictionary implements Map, Clonea ...

  3. Java集合详解4:一文读懂HashMap和HashTable的区别以及常见面试题

    <Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...

  4. 一天十道Java面试题----第二天(HashMap和hashTable的区别--------》sleep、wait、join)

    这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 11.HashMap和HashTable的区别及底层实现 12.ConcurrentHashMap原理简述,jdk7和jd ...

  5. HashMap和Hashtable的区别--List,Set,Map等接口是否都继承自Map接口--Collection和Collections的区别

    面试题: 1.HashMap和Hashtable的区别? HashMap:线程不安全,效率高,键和值都允许null值 Hashtable:线程安全,效率低,键和值都不允许null值 ArrayList ...

  6. HashMap和Hashtable的区别(转载)

    转载声明:转载自原文http://www.importnew.com/7010.html HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是 ...

  7. HashMap与HashTable的区别?

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

  8. Map集合及与Collection的区别、HashMap和HashTable的区别、Collections、

    特点:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值. Map集合和Collection集合的区别 Map集合:成对出现 (情侣)                       ...

  9. hashMap和hashTable的区别

    每日总结,每天进步一点点 hashMap和hashTable的区别 1.父类:hashMap=>AbstractMap hashTable=>Dictionary 2.性能:hashMap ...

  10. java分享第七天-01(Hashmap和Hashtable的区别&Property)

    一.Hashmap和Hashtable的区别 1 主要:Hashtable线程安全,同步,效率相对低下 HashMap线程不安全,非同步,效率相对高 2 父类:Hashtable是Dictionary ...

随机推荐

  1. 有限元方法[Matlab]-笔记

    <-- 访问笔记代码仓库 --> << MATLAB Codes for Finite Element Analysis - Solids and Structures (Fe ...

  2. js 时间转时间戳

    前言 有时候我们用时间插件,选择好时间后,需要把日期格式转化为时间戳,再传到后台 时间转时间戳 let time = Math.floor(new Date("2014-04-23 18:5 ...

  3. Error: Address already in use

    端口被某个进程占用 使用命令 lsof -i:端口号 然后看到进程号,直接杀掉进程就好 kill -9 进程号

  4. 『Plotly实战指南』--折线图绘制进阶篇

    上一篇介绍了Plotly绘制折线图的基础知识和数据预处理的技巧, 本文将重点探讨如何利用Plotly实现多线折线图的布局设计以及动态折线图的实现, 让我们一起掌握进阶的折线图绘制技巧. 1. 多折线图 ...

  5. Joker 可视化开发平台全局方法使用指南

    在 Joker 可视化开发平台中,全局方法是实现公共业务逻辑的有力工具,它能跨越组件和页面文件的界限,让开发者快速调用,显著提升开发效率.下面将详细介绍全局方法在平台中的使用方式. 一.全局方法的定义 ...

  6. Windows下PostgreSQL设置远程连接以及备份和恢复数据库

    一.设置远程连接 修改安装路径下的postgresql.conf,定位到listen_address  = '*',确保其值为'*'(Windows下默认是这样的,可不用修改) 修改安装路径下的pg_ ...

  7. 【Spring】事务操作

    事务概念 1.什么事务 事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败 典型场景:银行转账 lucy 转账 100 元 给 mary lucy 少 100,mar ...

  8. STM32_RTOS_V2编程模板1-消息队列

    #pragma region QUEUE1 // 1DEFINE osMessageQueueId_t queueDemo1 = NULL; // 2INIT queueDemo1 = osMessa ...

  9. Unity性能优化-降低功耗,发热量,耗电量之OnDemandRendering篇

    公司游戏项目,手机运行严重发烫,耗电量飞快.在暂时无法做其他美术性和技术性优化的情况下,我写了这个公司内部文档,并做了个实验,今天干脆公布出来,希望对大家有用. --官方文档: Unity - Scr ...

  10. LinkedBlockingQueue的take方法底层源码

    一.LinkedBlockingQueue的take方法底层源码 LinkedBlockingQueue 的 take 方法是其核心方法之一,用于从队列头部移除并返回元素.如果队列为空,调用 take ...