哈希表概念

在 Java 中,哈希表(Hash Table)是一种基于哈希表数据结构实现的集合,主要用于存储键值对(Key-Value),其核心特点是查询、插入、删除操作的平均时间复杂度接近 O (1),是日常开发中非常常用的数据结构。

可以和双向链表配合实现LRU。

Java 中与哈希表相关的核心类主要有 HashMapHashtable 以及 ConcurrentHashMap(线程安全版本),其中 HashMap 是最常用的实现类。下面从哈希表的基本原理、Java 中的具体实现(以 HashMap 为例)、核心特性等方面详细介绍:

一、哈希表的基本原理

哈希表的核心思想是通过哈希函数将键(Key)映射到数组中的某个索引位置,从而实现快速访问。具体步骤如下:

  1. 哈希函数(Hash Function):对键进行计算,得到一个哈希值(整数),再通过取模运算(如 hash % 数组长度)确定该键在数组中的存储索引。
  2. 存储结构:哈希表的底层通常是一个数组(称为 “哈希桶数组”),每个数组元素(桶)可能存储一个键值对,或一个链表 / 红黑树的头节点(用于解决哈希冲突)。
  3. 哈希冲突(Hash Collision):当两个不同的键通过哈希函数计算得到相同的索引时,就会发生冲突。Java 中主要通过链地址法解决冲突:将冲突的键值对以链表形式存储在同一个桶中;当链表长度超过阈值(默认 8)时,会转为红黑树(JDK 1.8+),以提高查询效率。

二、Java 中 HashMap 的实现细节

HashMap 是 Java 中哈希表的典型实现,以下是其核心特性和实现逻辑:

1. 底层数据结构(JDK 1.8+)
  • 数组(Node [] table) + 链表 + 红黑树 组成。
  • 数组的每个元素是 Node 类型(实现 Map.Entry 接口),包含 keyvaluehash 值和下一个节点的引用(next)。
  • 当链表长度超过 TREEIFY_THRESHOLD(默认 8)且数组长度 ≥ MIN_TREEIFY_CAPACITY(默认 64)时,链表会转为红黑树(TreeNode),以优化查询性能(红黑树查询时间复杂度为 O (log n),优于链表的 O (n))。
2. 哈希函数与索引计算
  • 对键的 hashCode() 进行二次哈希(扰动函数),减少哈希冲突:
    static final int hash(Object key) {
        int h;
        // 二次哈希:将hashCode的高16位与低16位异或,增加哈希值的随机性
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }
    
  • 计算索引:(数组长度 - 1) & hash(等价于 hash % 数组长度,但位运算效率更高)。
3. 扩容机制
  • 数组的初始容量(initialCapacity)默认是 16,负载因子(loadFactor)默认是 0.75。
  • 当元素数量(size)超过 容量 × 负载因子 时,会触发扩容(resize()):
    • 新容量为原容量的 2 倍(保证容量始终是 2 的幂,确保 (容量-1) & hash 计算索引的均匀性)。
    • 将原数组中的元素重新计算索引并迁移到新数组中(重新哈希)。
4. 常用操作的流程
  • put(key, value)

    1. 计算 key 的哈希值和索引。
    2. 若索引位置为空,直接插入新 Node。
    3. 若索引位置不为空,判断是否为红黑树:
      • 是:按红黑树规则插入。
      • 否:遍历链表,若存在相同 key 则更新 value,否则插入链表尾部;插入后若链表长度达标则转为红黑树。
    4. 若插入后元素数量超过阈值,触发扩容。
  • get(key)

    1. 计算 key 的哈希值和索引。
    2. 检查索引位置的节点:
      • 若为红黑树,按红黑树查找规则匹配 key。
      • 若为链表,遍历链表匹配 key,返回对应的 value。

三、HashMap 与 Hashtable 的区别

特性HashMapHashtable
线程安全非线程安全(多线程操作需手动同步)线程安全(方法加 synchronized 锁)
效率效率高(无锁竞争)效率低(锁粒度大)
允许的键值允许 key 和 value 为 null(key 仅允许一个 null)不允许 key 或 value 为 null
初始容量与扩容初始容量 16,扩容为 2 倍初始容量 11,扩容为 2 倍 + 1
迭代器类型快速失败(fail-fast)迭代器枚举器(Enumeration),不支持快速失败

四、哈希表的优缺点

  • 优点
    • 查询、插入、删除的平均时间复杂度接近 O (1),效率极高。
    • 支持通过键快速访问值,适合需要频繁查找的场景。
  • 缺点
    • 哈希函数设计不佳可能导致大量冲突,退化为链表,性能下降。
    • 元素存储无序(HashMap 不保证顺序,LinkedHashMap 可保证插入顺序)。
    • 扩容时需要重新哈希和迁移元素,可能产生性能开销。

五、使用场景

  • 需要快速根据键查找值的场景(如缓存、字典)。
  • 存储键值对且无需保证顺序的场景(如配置参数、用户信息映射)。
  • 非线程安全场景优先用 HashMap,线程安全场景可用 ConcurrentHashMap(比 Hashtable 更高效)。

【Copula光伏功率预测】基于单调广义学习系统(MBLS)和Copula理论的时空概率预测模型(Matlab代码实现)内容概要:本文介绍了一个基于单调广义学习系统(MBLS)和Copula理论的时空概率预测模型,用于光伏功率预测,并提供了相应的Matlab代码实现。该模型结合了MBLS在非线性映射和快速学习方面的优势,以及Copula函数在刻画多变量随机变量之间复杂相关性结构的能力,能够有效处理光伏发电的不确定性与时空相关性,从而提高预测精度和可靠性。此外,文中还列举了多个相关领域的研究案例和技术应用,展示了其在电力系统、机器学习、路径规划等多个方向的广泛应用前景。; 适合人群:具备一定编程基础和电力系统背景知识,熟悉Matlab编程语言,从事新能源发电预测、电力系统优化等相关领域研究的研发人员和高校师生。; 使用场景及目标:①应用于光伏电站的实际功率预测中,提升电网调度的准确性和稳定性;②作为学术研究工具,探索新型预测算法在处理非线性和不确定性问题上的潜力;③为其他可再生能源如风力发电的概率预测提供借鉴和参考。; 阅读建议:建议读者结合实际数据进行实验验证,深入理解MBLS和Copula理论的核心思想及其实现细节,同时关注模型参数的选择对预测性能的影响,以期达到最佳的应用效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值