跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Java HashSet
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Java HashSet = '''HashSet'''是Java集合框架(Java Collections Framework)中<code>Set</code>接口的一个实现类,它使用哈希表(Hash Table)作为存储结构。HashSet不保证元素的顺序,且不允许重复元素。它是基于<code>HashMap</code>实现的,但只存储键(key)而不存储值(value)。 == 核心特性 == * '''无序性''':元素存储顺序与插入顺序无关。 * '''唯一性''':不允许重复元素(基于<code>equals()</code>和<code>hashCode()</code>方法判断)。 * '''高效性''':添加、删除和查找操作的平均时间复杂度为O(1)。 * '''非线程安全''':需手动同步或使用<code>Collections.synchronizedSet()</code>包装。 == 实现原理 == HashSet内部通过<code>HashMap</code>实现。当添加元素时,元素作为<code>HashMap</code>的键(key),而值(value)统一为一个静态常量<code>PRESENT</code>。 <mermaid> classDiagram class HashSet { -map: HashMap +add(e: E): boolean +remove(o: Object): boolean +contains(o: Object): boolean } class HashMap { +put(key: K, value: V): V } HashSet --> HashMap : 内部委托 </mermaid> == 基本操作示例 == 以下代码展示HashSet的常见操作: <syntaxhighlight lang="java"> import java.util.HashSet; public class HashSetExample { public static void main(String[] args) { // 创建HashSet HashSet<String> languages = new HashSet<>(); // 添加元素 languages.add("Java"); languages.add("Python"); languages.add("C++"); System.out.println("初始集合: " + languages); // 输出顺序可能不同 // 重复元素测试 boolean added = languages.add("Java"); System.out.println("能否重复添加'Java'? " + added); // false // 删除元素 languages.remove("C++"); System.out.println("删除后: " + languages); // 检查元素存在性 System.out.println("包含Python? " + languages.contains("Python")); } } </syntaxhighlight> '''输出示例''': <pre> 初始集合: [Java, C++, Python] 能否重复添加'Java'? false 删除后: [Java, Python] 包含Python? true </pre> == 关键方法详解 == {| class="wikitable" ! 方法 !! 描述 !! 时间复杂度 |- | <code>boolean add(E e)</code> || 添加元素(若不存在) || O(1) |- | <code>boolean remove(Object o)</code> || 删除指定元素 || O(1) |- | <code>boolean contains(Object o)</code> || 检查元素是否存在 || O(1) |- | <code>int size()</code> || 返回元素数量 || O(1) |- | <code>void clear()</code> || 清空集合 || O(n) |} == 哈希冲突处理 == 当不同对象的哈希码(通过<code>hashCode()</code>计算)相同时,HashSet使用'''链地址法'''解决冲突。Java 8后,当链表长度超过阈值(默认为8)时,链表会转换为红黑树以提高性能。 冲突处理公式: <math> \text{存储位置} = \text{hash(key)} \mod \text{容量} </math> == 实际应用案例 == '''场景''':统计一篇文章中出现的唯一单词数量。 <syntaxhighlight lang="java"> import java.util.HashSet; import java.util.Arrays; public class WordCounter { public static void main(String[] args) { String text = "Java is to JavaScript what car is to carpet"; String[] words = text.split("\\s+"); // 按空格分割 HashSet<String> uniqueWords = new HashSet<>(Arrays.asList(words)); System.out.println("唯一单词数量: " + uniqueWords.size()); System.out.println("单词列表: " + uniqueWords); } } </syntaxhighlight> '''输出''': <pre> 唯一单词数量: 8 单词列表: [car, carpet, what, Java, is, to, JavaScript, car] </pre> == 性能优化建议 == 1. '''初始容量''':构造时指定预期大小(避免频繁扩容): <syntaxhighlight lang="java"> HashSet<Integer> numbers = new HashSet<>(100); // 初始容量100 </syntaxhighlight> 2. '''负载因子''':调整扩容阈值(默认0.75): <syntaxhighlight lang="java"> new HashSet<>(100, 0.6f); // 当60%满时扩容 </syntaxhighlight> 3. '''重写hashCode()''':自定义对象作为元素时需正确实现<code>hashCode()</code>和<code>equals()</code>。 == 与TreeSet对比 == {| class="wikitable" ! 特性 !! HashSet !! TreeSet |- | 数据结构 || 哈希表 || 红黑树 |- | 顺序 || 无序 || 自然排序/自定义排序 |- | 时间复杂度 || O(1) || O(log n) |- | 允许null || 是 || 否(除非自定义比较器) |} == 常见问题 == '''Q: 为什么我的自定义对象无法正确去重?''' A: 需确保重写了<code>equals()</code>和<code>hashCode()</code>方法,且满足: * 如果<code>a.equals(b)</code>为true,则<code>a.hashCode() == b.hashCode()</code> * 同一对象的hashCode值在生命周期内应保持一致 == 进阶话题 == * '''弱一致性迭代器''':迭代过程中修改集合可能导致<code>ConcurrentModificationException</code> * '''并行处理''':使用<code>Collections.synchronizedSet()</code>或<code>ConcurrentHashMap.newKeySet()</code>实现线程安全 {{Warning|在哈希函数不均匀时,HashSet可能退化为链表,导致性能下降至O(n)。}} [[Category:编程语言]] [[Category:Java]] [[Category:Java集合框架]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)