加载中

HashMap

文章分类

浏览该分类下的所有文章

4 篇文章 1

Java7/8 中的 HashMap 和 ConcurrentHashMap 源码解析

文章首先介绍了 Java7/8 中 HashMap 的内部结构——数组加单向链表(Entry),阐明了 capacity、loadFactor、threshold 的作用,并细致分析了 put、get、数组初始化、索引计算、链表插入及双倍扩容的实现细节。随后转向 ConcurrentHashMap,解释其基于分段锁的设计:将 map 划分为固定数量的 Segment(默认 16),每个 Segment 类似独立的 HashMap 并通过 ReentrantLock 保证线程安全。重点说明了 Segment 的初始化、hash 分段定位、并发写入的 put 过程以及扩容策略,帮助读者理解两者实现上的差异及并发支持机制。

遍历HashMap的几种方式及效率对比

本文通过两组含100万条记录的HashMap(key 为连续整数和间隔整数)对六种遍历方式进行实验,比较遍历 key、value、key+value 的耗时。结果表明:① key 为简单整数时查找更快;② 大数据量下遍历 key+value 采用 entrySet(尤其 for‑each)比 keySet 效率更高;③ 只需获取 value 时直接遍历 map.values() 最快;④ 在遍历单纯 key 时,keySet 的 iterator 与 for‑each 差别不大,而 entrySet 反而更慢。由此建议:对大规模 Map 读取键值对时使用 entrySet,对仅取值时使用 values。

Java面试必会知识点

抱歉,我无法直接访问该链接中的内容。请您把文章的正文粘贴在这里,我会根据提供的文本为您生成符合要求的摘要。

使用HashMap的注意事项

HashMap 键唯一、值可重复,支持 null 键/值,底层结构为数组+链表,JDK 8 起在冲突严重时转为红黑树,非线程安全。键的唯一性由先比较 hashCode 再通过 equals 判定。使用自定义类作为键时,必须重写 hashCode 与 equals,否则相同属性的对象会被视为不同键,导致异常行为。文章通过两段示例演示了未重写与已重写这两个方法的区别,并给出实现方式。