为什么Collection接口有,equals(Object o)并且hashCode(),假设任何实现默认具有那些(继承自Object)?
虽然
Collection界面没有为一般合同添加任何规定,但是 "直接"Object.equals实现Collection界面的程序员(换句话说,创建一个Collection但不是aSet或a的类List)如果他们选择覆盖,则必须小心Object.equals.没有必要这样做,最简单的操作方法是依赖于Object的实现,但实现者可能希望实现"值比较"来代替默认的"引用比较".(List和Set接口要求进行这样的价值比较.)该
Object.equals方法的一般合同规定等于必须是对称的(换句话说,a.equals(b)当且仅当如此b.equals(a)).列表的合同List.equals和Set.equals状态仅等于其他列表,并设置为其他集合.因此,当将此集合与任何列表或集合进行比较时,无法实现ListnorSet接口的集合类的自定义equals方法必须返回false.(通过相同的逻辑,不可能编写一个正确实现Set和List接口的类.)
和
虽然Collection接口没有为
Object.hashCode方法的常规合同添加任何规定,但程序员应注意,任何覆盖该Object.equals方法的类也必须覆盖该Object.hashCode方法以满足该Object.hashCode方法的一般合同.特别是c1.equals(c2)暗示c1.hashCode()==c2.hashCode().