博客
关于我
Java : 类集框架 (Map 接口概述) (HashMap + Hashtable)
阅读量:91 次
发布时间:2019-02-26

本文共 1803 字,大约阅读时间需要 6 分钟。

Map 接口及 HashMap 与 Hashtable 比较

Map 接口概述

Map 是 Java 中一个核心的接口,用于实现键值对的存储与管理。与 Collection 类不同,Map 的特点在于一次性存储两对象的关系:key 和 value。通过 key 可以快速定位并获取对应的 value,这种结构在实际应用中具有重要意义。


Map 接口常用方法

Map 接口提供了多种核心方法,主要包括以下几种:

  • put(K key, V value)

    • 方法特性:普通
    • 描述:将 key-value 对加入 Map 中。
  • get(Object key)

    • 方法特性:普通
    • 描述:根据 key 获取对应的 value,若无找到则返回 null。
  • keySet()

    • 方法特性:普通
    • 描述:返回所有 key 的集合,keySet 是不可重复的集合。
  • values()

    • 方法特性:普通
    • 描述:返回所有 value 的集合,values 可能包含重复元素。
  • entrySet()

    • 方法特性:普通
    • 描述:返回 Map 中所有 key-value 对的集合,每个元素都是 Map.Entry 类型。

  • Map 的实现类

    Map 本身是接口,具体实现类需要通过子类实现。常用的子类包括:

  • HashMap:最常用的 Map 实现类,无序,性能优异。
  • Hashtable:早期的 Map 实现类,具有线程安全性,但性能相对较低。
  • TreeMap:基于红黑树实现的 Map,支持键值对的排序。
  • ConcurrentHashMap:线程安全的 Map 实现类,性能优于 Hashtable。

  • HashMap 的实现原理

    HashMap 是基于哈希的原理实现的,其核心思想是使用 hash 函数将 key 转换为整数位置,快速定位存储位置。当数据量较小时,HashMap 采用链表存储;当数据量较大时,链表被替换为红黑树以减少查找时间。这种机制使得 HashMap 在数据量大的情况下仍能保持较高的查询效率。


    Hashtable 的特点及用途

    Hashtable 是 Java 的早期 Map 实现类,具有以下特点:

  • 线程安全:支持多线程环境下的安全操作。
  • 不允许 null:key 和 value 都不能为 null,否则会抛出 NullPointerException。
  • 同步机制:内部使用 synchronized 关键字实现同步。
  • 虽然 Hashtable 在早期具有重要地位,但在性能和灵活性方面不如 HashMap,因此在大多数场景下,开发者更倾向于使用 HashMap。


    HashMap 与 Hashtable 的区别

    特性 HashMap Hashtable
    推出版本 JDK 1.2 JDK 1.0
    性能 异步处理,性能较高 同步处理,性能较低
    安全性 线程非安全 线程安全
    存储 null 允许存储 null key 和 value 都不允许为 null

    使用 HashMap 的优化

  • 默认容量:HashMap 的默认容量为 16 或 2^N,其中 N 是最小的 power of 2 大于等于初始数组大小。
  • 负载因子:默认负载因子为 0.75,当存储数量达到负载因子时,进行扩容操作。
  • 计算方式:计算 hash 值时,采用 XOR (^) 运算符和位移操作(<<)来混合 key 和 value,以减少冲突概率。

  • 面试题解答

    Q:请解释 HashMap 的工作原理。

    A:HashMap 基于哈希表(数组+链表/红黑树)存储数据。首先,key 经过 hash 函数计算得到一个整数位置,将 value 存储在对应的链表或红黑树节点中。当链表长度超过 8 时,链表会被替换为红黑树,以减少查找时间。

    Q:HashMap 与 Hashtable 有什么区别?

    A:主要区别在于线程安全性和 null 的存储能力。Hashtable 是线程安全的,但性能较低;HashMap 是非线程安全的,但允许存储 null。


    总结

    Map 是 Java 中实现键值对存储的核心接口,其常用实现类包括 HashMap 和 Hashtable。HashMap 因其性能优异和灵活性,成为大多数场景下的首选,而 Hashtable 则在需要线程安全的环境下仍具有其用途。理解 Map 的实现原理和使用场景,是掌握 Java 集合框架的关键。

    转载地址:http://boyk.baihongyu.com/

    你可能感兴趣的文章
    Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合
    查看>>
    Openlayers中使用Image的rotation实现车辆定位导航带转角(判断车辆图片旋转角度)
    查看>>
    Openlayers中使用Overlay实现点击要素弹窗并且弹窗随之移动
    查看>>
    Vmware系列&虚拟机系列【仅供参考】:使用vCenter Auto Deploy制作ESXI系统封装(适合高版本vSphere)
    查看>>
    Openlayers中加载GeoJson文件显示地图
    查看>>
    Openlayers中加载Geoserver切割的EPSG:900913离线瓦片图层组
    查看>>
    Openlayers中加载Geoserver切割的EPSG:900913离线瓦片地图并显示
    查看>>
    Openlayers中多图层遮挡时调整图层上下顺序
    查看>>
    Openlayers中实现地图上添加一条红色直线
    查看>>
    Openlayers中将某个feature置于最上层
    查看>>
    Openlayers中点击地图获取坐标并输出
    查看>>
    Openlayers中设置定时绘制和清理直线图层
    查看>>
    Openlayers入门教程 --- 万字长篇
    查看>>
    Openlayers图文版实战,vue项目从0到1做基础配置
    查看>>
    OpenLayers学习三:地图旋转及地图跳转到某一点的方式(以类为接口)
    查看>>
    Openlayers实战:loadstart和loadend事件
    查看>>
    Openlayers实战:modifystart、modifyend互动示例
    查看>>
    Openlayers实战:判断共享单车是否在电子围栏内
    查看>>
    Openlayers实战:加载Bing地图
    查看>>
    Openlayers实战:加载GeoJSON
    查看>>