Hashmap原理

HashMap 是 Java 中广泛使用的基于哈希表的 Map 接口实现。它存储键值对,并且允许使用 null 作为键和值。以下是 HashMap 的一些关键概念和内部工作原理:

哈希表基础

  • 哈希函数HashMap 使用哈希函数来计算每个键的哈希码,这个哈希码决定了键值对(Entry)在 HashMap 内部数组中的存储位置(即索引)。
  • 数组:所有的 Entry 对象被存储在一个数组中,这个数组的大小是动态的,并且当 HashMap 中的 Entry 数量达到一个阈值时会重新进行散列(即 rehash),这涉及到扩展数组大小和重新定位现存的 Entry 对象。

键值对存储

  • 键值对:每个键值对在 HashMap 中以 Map.Entry 对象的形式存在。Entry 包含键、值和指向下一个 Entry 的引用(在解决哈希冲突时使用)。

哈希冲突和链表

  • 哈希冲突:当两个或多个键的哈希码相同时,会发生哈希冲突。为了解决哈希冲突,HashMap 使用链表来存储具有相同哈希码的 Entry 对象。这意味着具有相同哈希码的 Entry 对象会被链接在一起。

动态数组和链表转换为红黑树

  • 扩容和 rehash:当 HashMap 中的 Entry 数量达到容量和负载因子(load factor)的乘积时,HashMap 会进行扩容(通常是当前容量的两倍)并 rehash 所有的 Entry 对象。
  • 红黑树:在 Java 8 中,如果一个桶内的链表长度超过一定阈值(默认为 8),这个链表会被转换成红黑树以提高搜索效率。这减少了在最坏情况下操作的时间复杂度从 O(n) 降低到 O(log n)

主要方法

  • put(Key k, Value v):添加键值对到 HashMap。如果键已经存在,其对应的值将被新的值替换。
  • get(Object key):根据提供的键返回对应的值。如果键不存在,则返回 null
  • remove(Object key):删除指定键的键值对,并返回其对应的值。

迭代

  • 迭代顺序HashMap 的迭代顺序是不确定的,因为它依赖于键的哈希码和 HashMap 的容量。
  • entrySet()keySet()values()HashMap 提供了这几个方法来迭代键值对、键的集合或值的集合。

并发和线程安全

  • 线程安全HashMap 不是线程安全的。如果需要在多线程环境中使用 HashMap,可以使用 Collections.synchronizedMap 方法来包装 HashMap 或者使用 ConcurrentHashMap

以上是 HashMap 的一些关键原理和特性。理解这些原理有助于更有效地使用 HashMap,并且在面对性能问题时能够做出正确的优化决策。

  • 28
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java奋斗者

听说打赏我的人再也不会有BUG

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值