hashset能自动去重,因其底层用hashmap存储元素,元素作key,利用key唯一性;添加时调用map.put(e, present)==null判断,重复则返回false;自定义对象须重写hashcode()和equals()以保证逻辑相等性。

HashSet 添加不重复元素靠的是底层 HashMap 的 key 唯一性机制,它自动处理重复判断,你只需调用 add() 方法即可。
HashSet 为什么能自动去重
HashSet 内部封装了一个 HashMap,添加的元素作为 HashMap 的 key,而 HashMap 的 key 不允许重复。当调用 add(E e) 时,实际执行的是:map.put(e, PRESENT) == null(PRESENT 是一个固定的哑值对象)。
如果 key 已存在,put() 返回旧值(非 null),add() 就返回 false,不插入;否则插入并返回 true。
确保不重复的关键:正确重写 equals() 和 hashCode()
如果存的是自定义对象(比如 Person),必须同时重写 hashCode() 和 equals(),否则即使逻辑上相等的对象也可能被当作不同元素添加进去。
-
hashCode() 必须一致:相等的对象(
equals()返回 true)必须有相同哈希码,否则可能被分配到不同桶,跳过 equals 比较 - equals() 要符合对称、传递、自反、一致性原则:避免逻辑混乱导致误判
- IDE(如 IntelliJ)可一键生成规范的
hashCode()和equals()
添加元素的典型写法
直接调用 add(),它会返回布尔值表示是否新增成功:
HashSet<string> set = new HashSet();
System.out.println(set.add("apple")); // true
System.out.println(set.add("apple")); // false(已存在,不添加)
System.out.println(set.add("banana")); // true</string>
注意:add() 不抛异常,也不报错,只是静默忽略重复项。
常见误区提醒
-
null 可以添加且只允许一个:HashSet 允许存一个
null元素(HashMap 的 key 支持 null) - 不是线程安全的:多线程并发 add 可能出错,需用
Collections.synchronizedSet()或ConcurrentHashMap.newKeySet() - 不保证顺序:元素遍历顺序与插入顺序无关,如需有序请用
LinkedHashSet
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











