当前位置: 首页 > news >正文

面试题之HashMap与HashTable的区别

HashMap 与 HashTable 的区别

  1. 首先可以从源码中看出第一个区别:继承的类不同

    //HashMap
    public class HashMap<K,V> extends AbstractMap<K,V>
        implements Map<K,V>, Cloneable, Serializable {...}
    
    //HashTable
    public class Hashtable<K,V>
        extends Dictionary<K,V>
        implements Map<K,V>, Cloneable, java.io.Serializable {...}
    
    • HashMap 继承了 AbstractMap 抽象类,并且实现了 Map 接口、Cloneable 接口、Serializable 接口。
    • HashTable 继承了 Dictionary 抽象类,并且实现了 Map 接口、Cloneable 接口、Serializable 接口。
  2. 通过两者源码的无参构造函数可以看出:两者默认容量不同

    //HashMap
    // Constructs an empty HashMap with the default initial capacity (16) and the default load factor (0.75).
        public HashMap() {
            this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
        }
    
    //HashTable
    // Constructs a new, empty hashtable with a default initial capacity (11) and load factor (0.75).
        public Hashtable() {
            this(11, 0.75f);
        }
    
    • HashMap 的默认初始容量为16,填充因子为0.75。
    • HashTable 的默认出事容量为11,填充因子为0.75。
  3. 是否支持null值作为key和value

    • HashTable 不允许 null 值作为 key 和 value。
    • HashMap 可以使用 null 值作为 key 和 value(由于 Map 是不可重复的集合,所有最多只允许一个 null 值作为 key)。
    • 虽说 HashMap 支持 null 值作为 key,不过建议还是尽量避免这样使用,因为一旦不小心使用了,若因此引发一些问题,排查起来很是费事。HashMap 以 null 作为 key 时,总是存储在 table 数组的第一个节点上。
  4. 扩容方面的差别

    • HashMap 的元素个数超过阈值(容量 * 填充因子),则进行扩容

      • 扩容结果:

        新容量 = 旧容量 * 2

        新阈值 = 新容量 * 填充因子

    • HashTable 的元素个数超过阈值(容量 * 填充因子),则进行扩容

      • 扩容结果:

        新容量 = 旧容量 * 2 + 1

        新阈值 = 新容量 * 填充因子

  5. HashMap与HashTable最主要的区别就是线程安全问题

    HashMap 是线程不安全的,HashTable 是线程安全的

    在 HashTable 的底层的实现方中,都添加了 synchronized 关键字来确保线程同步,这也造成了 HashTable 的效率比更HashMap 低。在不考虑线程安全的情况下,优先使用HashMap;若需要考虑线程安全的问题,通常也是使用 Collections 工具包下的 synchronizedMap底层也是通过加 synchronized 关键字确保线程安全)或者使用 Map 的子实现类ConcurrentHashMap。(ConcurrentHashMap详解)

这是我在某个公司面试时被问到的问题,希望可以帮助到大家。

相关文章:

  • ASEMI整流桥SKBPC3516,SKBPC3516参数,SKBPC3516应用
  • java固定资产设备管理系统(源码开源分享)
  • 计算机网络学习笔记
  • Leetcode 84.柱状图中最大的矩形
  • 鸿蒙智联开发者平台项目的理解介绍
  • apollo配置中心
  • 华为CSE框架的一些知识点
  • vxe-table 将表格指定行设置颜色后,选中行、悬浮行样式失效解决。
  • 这些提高摸鱼效率的自动化测试技巧,提高打工人幸福感~
  • HelloSpring
  • Vite为啥如此之快
  • 从二值 Mask 获取外接矩形坐标
  • Tomcat 的本地部署及 SmartTomcat 的使用
  • Unity Shader LightMode 标签
  • linux搭建docker镜像服务
  • python3.6+scrapy+mysql 爬虫实战
  • [译]Python中的类属性与实例属性的区别
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 2017前端实习生面试总结
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • CSS魔法堂:Absolute Positioning就这个样
  • css选择器
  • dva中组件的懒加载
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • gops —— Go 程序诊断分析工具
  • JavaScript对象详解
  • JS变量作用域
  • Laravel 实践之路: 数据库迁移与数据填充
  • Less 日常用法
  • node.js
  • SpiderData 2019年2月16日 DApp数据排行榜
  • SQLServer之创建显式事务
  • 程序员最讨厌的9句话,你可有补充?
  • 从PHP迁移至Golang - 基础篇
  • 搭建gitbook 和 访问权限认证
  • 当SetTimeout遇到了字符串
  • 力扣(LeetCode)965
  • 前端路由实现-history
  • 实现菜单下拉伸展折叠效果demo
  • 使用 @font-face
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 最近的计划
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 容器镜像
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​如何防止网络攻击?
  • #大学#套接字
  • #前后端分离# 头条发布系统
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (10)STL算法之搜索(二) 二分查找
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (二)WCF的Binding模型
  • (附源码)springboot猪场管理系统 毕业设计 160901