为何HashMap、LinkedHashMap的values()集合equals比较返回false?
问题澄清与原因解释
首先要纠正一个关键点:你提供的代码实际运行时,两种场景下的equals()都会返回true,而非你注释里写的false。如果你的运行结果确实是false,大概率是出现了其他特殊情况,比如元素重复数量不一致、自定义对象未正确重写equals()等。
下面解释为什么正常情况下equals()会返回true:
- 不管是
HashMap还是LinkedHashMap,它们的values()方法返回的都是各自的内部集合类,但这些类都继承自AbstractCollection,equals()逻辑遵循AbstractCollection的实现。 AbstractCollection的equals()判断逻辑是:- 先检查对方是不是
Collection类型,不是直接返回false; - 对比两个集合的大小,大小不同直接返回
false; - 调用
containsAll()验证对方的所有元素都存在于当前集合中——因为两个集合大小相同,只要双向都满足包含关系,就说明元素完全一致。
- 先检查对方是不是
- 对于
HashMap.Values和LinkedHashMap.Values来说,它们的contains()方法底层都是依赖Map.containsValue(),只要值在Map中存在就会返回true。哪怕LinkedHashMap的values集合保留了插入顺序,containsAll()也不会关心顺序,只检查元素是否存在。
如果你的运行结果确实是false,可以排查以下情况:
- 两个Map的values集合元素数量不同(比如一个有重复值,另一个没有);
- 元素是自定义对象,未正确重写
equals()和hashCode(),导致containsValue()判断错误; - 使用了自定义的Map实现,重写了
values()返回集合的equals()逻辑。
内容的提问来源于stack exchange,提问作者Samrudh S
相关产品推荐
相关产品推荐

