Java 集合:哪些集合必须重写 equals() 和 hashCode()?
2026/7/3 4:15:50 网站建设 项目流程

@[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 条记忆口诀

  1. 只要带 Hash 字样的集合 → 两个方法都必须重写!
  2. List 集合 → 只重写 equals 即可
  3. Tree 开头的集合 → 不看这两个方法,只看比较器

六、高频面试题标准答案(背会直接用)

问:哪些集合需要重写 equals 和 hashCode?
答:
所有基于哈希表实现的集合都需要,包括:
HashSet、LinkedHashSet、HashMap、LinkedHashMap、ConcurrentHashMap等。
这些集合判断元素/键是否重复,会先比较hashCode,再比较equals
如果不重写,就会出现内容相同但判定为不同对象的问题。



🌺The End🌺点点关注,收藏不迷路🌺

⬆ ⬆ 顶部 ⬆ ⬆

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询