为什么Collection接口有equals(Object o)
和hashCode()
,因为任何实现都会默认使用这些接口(从Object
继承)?为什么Collection接口有equals()和hashCode()?
回答
虽然 的
Collection
接口增加了不规定合同 一般为Object.equals
,谁落实Collection
接口“直接”(即程序员,创建一个类,是Collection
但不是Set
或List
)必须小心,如果他们 选择覆盖Object.equals
。没有必要这样做, ,最简单的方法是依靠Object的 实现,但实现者可能希望实现“值 比较”来代替默认的“参考比较”。 (该List
和Set
接口任务这样的值的比较。)为等于 必须是对称的
Object.equals
方法状态的一般合同(换句话说,a.equals(b)
当且仅当b.equals(a)
)。List.equals
和Set.equals
的合同规定 列表仅与其他列表相同,并设置为其他集合。因此,对于既不实现List
也不实现Set
接口的集合类的自定义等于方法必须返回false,此集合是 与任何列表或集合相比较。 (通过相同的逻辑,这是不可能的 编写正确的同时实现Set和List 接口的类。)
和
虽然Collection接口没有增加规定向一般
Object.hashCode
方法的合同,程序员应该注意,任何覆盖Object.equals
方法的类都必须覆盖Object.hashCode
方法,以满足Object.hashCode
方法的一般合同。特别是,c1.equals(c2)
意味着c1.hashCode()==c2.hashCode()
。
要回答你的具体问题:为什么它有这些方法?这只是为了方便起见,可以包含Java Docs,提供关于实现者应该如何处理这些方法的提示(例如比较值的相等而不是引用)。
当任何类实现接口时,它会注入/接受由接口定义的合约/规则。
Equalable & Hashable是两个默认提供的合同/规则。通过这样做假设给定类的equals和hashCode对该类是正确实现的。
- 1. toString,hashcode和equals方法内部接口
- 2. 什么是重写equals()和hashCode()的POJO?
- 3. Overrding equals和hashCode
- 4. Map HashCode和Equals
- 5. contains()的Collection框架不使用hashcode,而是使用equals(),为什么?
- 6. 这个声明对重写hashcode和equals有什么意义?
- 7. Java equals()和hashCode()的变化
- 8. Google App Engine,JDO和equals/hashCode
- 9. 面试之谜 - 为什么我们要重写了hashCode和equals方法
- 10. 为什么Map不能扩展Collection接口
- 11. 如何实现hashCode和equals方法
- 12. 忽略equals()和hashCode()在Java中
- 13. 重写的hashCode()和equals()方法
- 14. SCJP hashCode()和equals()方法混淆
- 15. 在Eclipse中调试equals()和hashCode()
- 16. 为什么[WCF]有接口
- 17. 所有类都应该有.equals和.hashcode方法吗?
- 18. 为什么没有Stream.flatMap(Collection)方法?
- 19. 如果有什么的Equals为NaN
- 20. 为什么AbstractCollection没有实现equals()?
- 21. 当superclass不重新声明equals()和hashCode()时会出现什么问题?
- 22. 为什么对象不相同添加有相同的值,HashSet的,甚至的hashCode和equals被覆写
- 23. 使用自然键作为equals和hashCode的一部分
- 24. 我创建equals()和hashCode()是没有做任何事情
- 25. Linq:在连接中==和equals有什么区别?
- 26. 实现java Collection接口的正确方法是什么
- 27. Clojure:为什么=和.equals字符串有不同的表现?
- 28. 为什么没有SqlDataReader.ReadAsync()的接口
- 29. 我的@implementation中有@接口 - 为什么?
- 30. 为什么Java中没有“Equlable”接口?