Java集合框架:HashMap与Set的实现与使用

发布时间:2026/11/1 6:07:47

Java集合框架:HashMap与Set的实现与使用 1. HashMap自定义实现下面是一个简化版的HashMap实现使用数组链表的方式处理哈希冲突package map; public class MyHashMap { static class Node { public int key; public int value; public Node next; public Node(int key, int value) { this.key key; this.value value; } } private Node[] table new Node[1001]; private int size; private int hashCode(int key) { return key % table.length; } public void put(int key, int value) { int index hashCode(key); // 遍历链表看key是否在链表中存在 // 如果存在就修改对应的value Node head table[index]; for (Node cur head; cur ! null; cur cur.next) { if (cur.key key) { cur.value value; return; } } // 不存在就直接头插 Node newNode new Node(key, value); newNode.next head; table[index] newNode; size; // 扩容 if ((double)size / table.length 0.75) { resize(); } } // 扩容操作 private void resize() { Node[] newTable new Node[table.length * 2]; for (int i 0; i table.length; i) { for (Node cur table[i]; cur ! null; cur cur.next) { Node newNode new Node(cur.key, cur.value); int newIndex cur.key % newTable.length; newNode.next newTable[newIndex]; newTable[newIndex] newNode; } } table newTable; } // 根据键获取值 public Integer get(int key) { int index hashCode(key); for (Node cur table[index]; cur ! null; cur cur.next) { if (cur.key key) { return cur.value; } } return null; } // 删除键值对 public void remove(int key) { int index hashCode(key); if (table[index] null) { return; } if (table[index].key key) { table[index] table[index].next; size--; return; } Node prev table[index]; Node cur table[index].next; while (cur ! null) { if (cur.key key) { prev.next cur.next; size--; } prev cur; cur cur.next; } } }2. Set集合的使用示例下面是TreeSet和HashSet的基本操作示例package set; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public class Test { public static void main(String[] args) { SetString set new TreeSet(); SetString set2 new HashSet(); set.add(aaa); set.add(bbb); set.add(ccc); set.add(ddd); set.add(eee); // 删除元素 set.remove(bbb); System.out.println(set); // 获取元素个数 System.out.println(set.size()); // 判定是否为空 System.out.println(set.isEmpty()); // 清空整个集合 set.clear(); System.out.println(set); // 遍历方式1增强for循环 for (String s : set) { System.out.println(s); } // 遍历方式2迭代器 IteratorString it set.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } }3. 核心实现解析3.1 HashMap实现要点哈希函数使用取模运算计算索引位置冲突解决采用链地址法每个桶使用链表存储扩容机制当负载因子超过0.75时进行扩容头插法新节点插入链表头部时间复杂度O(1)3.2 Set集合特点TreeSet基于红黑树实现元素有序HashSet基于HashMap实现元素无序共同特性不允许重复元素支持快速查找4. 使用建议在实际开发中建议优先使用Java标准库的HashMap和HashSet理解底层实现有助于优化性能根据需求选择合适的集合类型注意线程安全问题多线程环境下使用ConcurrentHashMap
延伸阅读

更多相关文章

2026/11/1 11:41:05

2026年泡菜废水治理企业推荐,这几家技术方案真靠谱

泡菜行业废水治理一直是环保圈内的“硬骨头”。高盐、高有机物、高氮磷的综合特性让传统生化处理频频失效。根据《环境工程学报》2024年的一项研究,当盐浓度超过0.2%时,普通活性污泥法的COD去除率会下降40%以上,这让很多泡菜企业年年治污&…

2026/11/1 15:10:23

成绩单公证流程,证天下小程序帮你省一半时间!

这篇文章会从实际操作角度,把成绩单公证的全流程讲清楚,包括适用场景、所需材料、费用周期,还会对比线下办理、证天下线上办理和其他三方小程序的不同体验,帮你避开常见的办理坑点,同时附上证天下公证小程序的详细操作…

2026/11/1 17:19:31

在 Visual Studio 中完全掌控您的悬浮窗口

的是,有一项鲜为人知的设置,能够让您精准控制 Visual Studio 对浮动窗口的控制程度。设置路径如下:Tools > Options > Environment > Windows > Floating Windows。您将会看到此对话框:该下拉菜单标注有“These float…

2026/11/1 2:01:37

1.c++入门篇

1.c中的关键字asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseenummutablestaticunionwchar_tcatchexplicitnamespacestatic_castunsigneddefaultcharexportnewstructusingfriendclassext…

2026/11/1 2:01:37

《江灯合声》:有可行的分框版,也仍可以选择连续鸣谢

武汉江岸区栎坡合唱团在免费节目册《江灯合声》中,以表格集中鸣谢资助者。各家共同要求改为独立小框,团里仍想保留表格。现有全名与支持事项清楚可见,双方此前未承诺具体排版。我支持保留表格。补充的试排材料让选择更具体:分框能…

2026/11/1 2:01:37

关于“贾子猜想”的数学地位、结构特征与讨论边界

关于“贾子猜想”的数学地位、结构特征与讨论边界摘要 本文对“贾子猜想”进行基于公开表述与现有数学事实的分析。该猜想主张:当正整数 n3m>5(即 n6,9,12,15,…)时,方程x₁ⁿ x₂ⁿ ⋯ xₙⁿ yⁿ不存在正整数解。文章首先…

2026/11/1 2:01:37

启动报Port 8088 was already in use?先查是谁占的

启动报Port 8088 was already in use?先查是谁占的 项目启动报 Port 8088 was already in use,意思很直白:这个端口已经有人占了。 先说原理:端口是"门牌号",一间房只住一个进程 端口就是一台机器上的门牌号…

2026/11/1 2:01:37

担心文档上云?本地运行的办公AI才敢放心用

单位上周开了个会,主题是"AI 提效",散会时领导补了一句:涉及客户资料的文档,不许往云端传。这话一出,会议室里本来跃跃欲试的同事全蔫了——大家平时用的那些在线 AI,文档一上传就不知道存哪儿去…

2026/11/1 1:56:37

华为OD机试真题 新系统 2026-10-28 JavaGoC【社交网络消息转发】

目录 题目 思路 Code 题目 题目内容: 在一个社交网络中,有 N 个用户(编号 0 到 N−1);每个用户都有一个「转发名单」(整数),该数二进制格式中的第 i 位为 1 表示此用户会把消息转发给第 i 个用户。 给定一个整数数组 forwardLists 和一个整数 initialSenders,请…

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑