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