博客
关于我
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/

    你可能感兴趣的文章
    OpenCV入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    opencv图像分割2-GMM
    查看>>
    opencv图像分割3-分水岭方法
    查看>>
    opencv图像切割1-KMeans方法
    查看>>
    OpenCV图像处理篇之阈值操作函数
    查看>>
    opencv图像特征融合-seamlessClone
    查看>>
    OpenCV图像的深浅拷贝
    查看>>
    OpenCV学习(13) 细化算法(1)(转)
    查看>>
    OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
    查看>>
    OpenCV学堂 | CV开发者必须懂的9种距离度量方法,内含欧氏距离、切比雪夫距离等(建议收藏)
    查看>>
    OpenCV学堂 | OpenCV案例 | 基于轮廓分析对象提取
    查看>>
    OpenCV学堂 | YOLOv8实战 | 荧光显微镜细胞图像检测
    查看>>
    OpenCV官方文档 理解k - means聚类
    查看>>
    OpenCV探索
    查看>>
    OpenCV环境搭建(一)
    查看>>
    openCV目标识别 目标跟踪 YOLO5深度学习 Python 计算机视觉 计算机毕业设计 源码下载
    查看>>
    opencv笔记(1):图像缩放
    查看>>
    opencv笔记(二十四)——得到轮廓之后找到凸包convex hull
    查看>>
    OpenCV计算点到直线的距离 数学法
    查看>>
    Opencv识别图中人脸
    查看>>