决定将这些方法包含在java.lang.Object中的背后原因是什么?平等和哈希对于许多类没有意义。
建立两个接口将更加合乎逻辑:
interface Equalable {
boolean equals(Equalable other);
}
interface Hashable extends Equalable {
int hashCode();
}
例如,HashSet定义可能看起来像
class HashSet<T extends Hashable> ...
这将防止出现一个常见的初学者错误-使用项目集而不实现equals / hashCode。
当我们实现一个接口时,我们注入(或接受)该接口定义的合同。
Equalable
&Hashable
是两个不同的合同。但是,如果我们仔细观察,就会发现它们彼此依赖,这意味着它们是的一部分single interface
,类似EqualableAndHashable
。
现在显而易见的问题是,它们是否应该成为此新EqualableAndHashable
界面的一部分Object
?
让我们找出答案。我们==
(等于运算符)检查两个对象的相等性。==
运算符确认两个不同图元/对象的值/引用是否相等。但这并不总是可能仅通过与==
操作员确认来回答。
现在的问题是,是否应该通过接口或对象类的一部分来注入相等性(也就是契约)?
如果我们看一看,我们不能只说:
TypeX
不保证平等合同。
如果某些对象类型提供相等性而某些对象不提供相等性,则将变得混乱。这意味着of的对象TypeX
必须遵守平等契约,这对于所有其他对象类型也是如此。因此,它绝不能从接口注入相等性,因为缺省情况下,相等性应该是任何对象的合同的一部分,否则它将造成混乱。
因此,我们需要Objects提出的实现equals
。但是它不能仅实现equals
方法,还需要实现hashcode
方法。
问题内容: 我是泛型新手,所以不确定我的问题的答案是否是真的。在下面的代码中,对一个对象条目的键进行大小写需要什么? 它似乎很容易被替换 更多参考: 问题答案: 这是一种极端的优化措施,对于通用编程实践来说可能不是必需的。这是一个可以回答您问题的讨论。下面的语句是从该帖子中复制的: 这是Doug Lea流行的一种编码风格。这是一个极端的优化,可能没有必要。您可以期望JIT进行相同的优化。(您可以尝
问题内容: 如果我重写一个类两种方法,它必须确保,如果那么也必须是真实的。 有人可以告诉我一个简单的示例,如果违反了该示例,将会引起问题吗?我认为这与您使用该类作为Hashmap的键类型有关吗? 问题答案: 当然: 与: 从技术上讲应该是正确的,因为在两种情况下m == 3。 通常,HashMap的工作方式如下:它具有可变数量的通常称为“存储桶”的数量。存储桶的数量可以随时间变化(随着条目的添加和
或者“为什么Sun/Oracle的家伙每次都强迫我们重写equals()和hashCode()?” 每个人都知道,如果你覆盖一个对象的equals()或hashCode(),你也必须覆盖另一个,因为这两者之间有一个约定: 请注意,每当重写hashCode方法[e.equals()]时,通常有必要重写该方法,以维护hashCode方法的一般约定,即相等的对象必须具有相等的哈希代码。-对象的API文档
问题内容: 在java中为什么需要覆盖equals和hashcode方法?什么时候用到? 问题答案: 让我们尝试通过一个示例来理解它,如果我们不进行覆盖而覆盖并尝试使用。 假设我们有一个类像这样那样的两个对象是相等的,如果他们等于(和生成) 仅覆盖 如果仅覆盖被覆盖,则在你第一次调用时将散列到某个存储桶,而在调用时将散列到其他存储桶(因为它们具有不同的)。因此,尽管它们是相等的,但由于它们没有散列
当在应用程序上工作时,我想为我的值对象(用户定义的VO)丢弃重复的条目,我通过覆盖hashCode()、equals()方法使用了Set数据结构。 我尝试了几次迭代,它工作得很好,但我想了解的是,独特性实际上是如何保持的?是用新对象替换旧对象,还是简单地忽略新对象? 因为它们是一样的,我怎么在上面检查呢? 谢谢
问题内容: 我定义了两个类,以便它们都包含对另一个对象的引用。它们看起来与此类似(这是简化的;在我的实际域模型中,类A包含一个B列表,每个B都有对父A的引用): 在与已通过使用Eclipse中A和B这两个问题的两个场产生的是调用或在任一对象方法的结果在因为它们都调用另一个对象的和方法。例如,以下程序将无法使用上述对象: 如果用这种方式用循环关系定义域模型存在内在的错误,请告诉我。据我所知,虽然这是