2009-09-29 58 views

回答

1

Equals方法将两个对象(或作为参数传入的对象与调用该方法的对象)进行比较。

getHashCode返回一个对每个不同对象都唯一的代码。

这些方法在每个对象中实现。要重写这些方法,您将重新定义这些对象如何定义相等性。

要重写一个类,您需要在具有相同签名的子类中创建一个方法(有时候还有另一个关键字,例如'override',具体取决于语言)。

您可以使用基本方法,或完全定义一个新的方法。 如果您调用基本方法,则这必须是方法内的第一条语句。

0

覆盖等于允许您定义对于您的对象类型而言,相等的语义是什么,超出默认值“这些是相同的对象实例吗?” - 所以你可以定义两个不同的对象,其内容是字符串“猫”是基本相同的。哈希代码被用作等式的快速代理(两个相同的对象必须具有相同的哈希代码,尽管反过来显然不成立)以插入散列表或类似的数据结构。

它只适用于基本上不可变的类型,以便一次完成的比较将保持为真(考虑散列表用例)。

0

我会尽力解释。 您正在编写的类的基类已经提供了一个Equals和GetHashCode方法,并标记了这些方法,以便您可以根据需要提供自己的实现。

您可以通过编写与基类中的方法具有相同签名的方法来提供您自己的实现,并将它们标记为基类中方法的“覆盖”。

这告诉编译器,无论何时有人调用Equals或GetHashCode,都希望使用实现而不是基类中提供的实现。大多数语言将允许您以某种方式调用基类的实现。这种方式可以构建逻辑回退到基本实现或使用基本实现作为您自己实现的起点。

1

这两种方法对于管理对象是必不可少的。 equals()用于比较两个对象(不一定是相同类型,请介意),并且希望给出该对象的唯一数字表示形式。

在大多数面向对象的语言中,每个类都有这两种方法的默认实现,这就是对于你的类不够好。为了使这些方法有用,有必要用有意义的代码覆盖这个默认实现。

这些方法在哪里使用?假设你有一个对象散列表。在表格中插入一个新对象需要一个数字值用于初始索引搜索。这通常使用hashCode()方法提取,该方法最好给出一个不同的数字(如果散列表大小是素数,它也会有所帮助)。在表格中搜索某个项目需要将包含的项目与给定的样本对象进行比较。这是通过equals()方法实现的,因此重要的是该方法检查特定类的字段是否相等,而不仅仅检查内存中的对象地址。