@[TOC](Java 集合:哪些集合必须重写 equals() 和 hashCode()?)
🌺The Begin🌺点点关注,收藏不迷路🌺 ⬇ ⬇ 底部 ⬇ ⬇ |
一、一句话核心结论
所有基于「哈希表 / 散列」实现的集合,都必须重写equals()和hashCode()!
只要集合底层用到了HashMap / HashSet / Hashtable这类结构,自定义对象放进去,不重写就无法去重、无法查找。
二、必须重写的集合清单(高频使用)
下面这些集合,放入自定义对象时,必须重写两个方法,否则功能异常:
1. Set 系列(全部哈希型都要)
- HashSet
- LinkedHashSet(继承 HashSet,底层也是 HashMap)
- CopyOnWriteArraySet(并发集合,底层依赖 equals 判断重复)
作用:保证元素不重复
2. Map 系列(key 必须重写!value 不需要)
Map 只对key做唯一性校验,value 随便存,所以:
Map 的 key 必须重写,key 必须重写!
- HashMap
- LinkedHashMap
- WeakHashMap
- Hashtable
- ConcurrentHashMap(线程安全的哈希表)
作用:保证 key 不重复、能正确 get 取值
3. 其他依赖哈希的集合
- PriorityQueue(不一定必须,但某些比较逻辑需要)
- HashSet 相关工具类/并发包装类
三、不需要重写的集合(重点区分!)
下面这些完全不依赖 hashCode,只依赖equals / 比较器,所以:
只重写 equals 就行,hashCode 可写可不写!
1. List 系列
- ArrayList
- LinkedList
- Vector
它们判断重复用的是equals(),根本不用 hashCode!
2. 有序/树型集合(依赖 Comparable / Comparator)
- TreeSet
- TreeMap
这两个最特殊:
不看 hashCode,不看 equals!只看 compareTo / 比较器!
只要比较结果=0,就判定为重复元素。
四、超级清晰总结表(建议直接保存)
| 集合类型 | 是否需要重写 equals | 是否需要重写 hashCode | 依赖规则 |
|---|---|---|---|
| HashSet / LinkedHashSet | ✅ 必须 | ✅ 必须 | hashCode + equals |
| HashMap / LinkedHashMap | ✅ key 必须 | ✅ key 必须 | hashCode + equals |
| ConcurrentHashMap | ✅ key 必须 | ✅ key 必须 | hashCode + equals |
| ArrayList / LinkedList | ✅ 需要 | ❌ 不需要 | 只依赖 equals |
| TreeSet / TreeMap | ❌ 不需要 | ❌ 不需要 | 只依赖比较器 |
五、最关键的 3 条记忆口诀
- 只要带 Hash 字样的集合 → 两个方法都必须重写!
- List 集合 → 只重写 equals 即可
- Tree 开头的集合 → 不看这两个方法,只看比较器
六、高频面试题标准答案(背会直接用)
问:哪些集合需要重写 equals 和 hashCode?
答:
所有基于哈希表实现的集合都需要,包括:
HashSet、LinkedHashSet、HashMap、LinkedHashMap、ConcurrentHashMap等。
这些集合判断元素/键是否重复,会先比较hashCode,再比较equals,
如果不重写,就会出现内容相同但判定为不同对象的问题。
🌺The End🌺点点关注,收藏不迷路🌺 ⬆ ⬆ 顶部 ⬆ ⬆ |