某为(BAT)二面:你重写过hashcode和equals么,要注意什么

某为(BAT)二面:你重写过hashcode和equals么,要注意什么前言在 Java 中 hashCode 和 equals 是两个非常重要的方法 其中 hashCode 方法返回对象的哈希码 而 equals 方法用于比较两个对象是否相等 重写这两个方法是一个非常常见的操作 通常用于自定义

欢迎大家来到IT世界,在知识的湖畔探索吧!

前言

在 Java 中,hashCode()equals() 是两个非常重要的方法。其中 hashCode() 方法返回对象的哈希码,而 equals() 方法用于比较两个对象是否相等。重写这两个方法是一个非常常见的操作,通常用于自定义类型,以确保对象的正确性和可靠性。在本篇技术博客文章中,我们将讨论重写 hashCode()equals() 方法的重要性,以及如何正确地重写这两个方法。

某为(BAT)二面:你重写过hashcode和equals么,要注意什么

欢迎大家来到IT世界,在知识的湖畔探索吧!

为什么需要重写hashCode和equals方法

当我们使用 Java 自带的数据结构时(如 HashSet、HashMap),它们会使用对象的 hashCode() 方法来计算存储位置,以及使用 equals() 方法来比较两个对象是否相等。因此,如果我们不重写这两个方法,这些数据结构就无法正确地处理我们的自定义类型,会导致程序出现异常。

另外,重写这两个方法还可以确保对象的正确性和可靠性。如果两个对象被认为是相等的,则它们的哈希码应该相同。因此,重写这两个方法可以确保在使用哈希表时对象被正确地存储和检索。

重写hashCode方法

hashCode() 方法用于计算对象的哈希码。它的返回值是一个 int 类型的数值,通常用于存储对象在哈希表中的位置。重写 hashCode() 方法的主要目的是确保两个相等的对象具有相同的哈希码。

以下是重写 hashCode() 方法时需要注意的几点:

1. 哈希码必须是不变的

在对象的生命周期内,哈希码必须是不变的。这意味着在对象的状态发生变化时,哈希码也必须保持不变。如果哈希码随对象的状态变化而变化,则该对象无法被正确地检索。

2. 相等的对象必须具有相同的哈希码

如果两个对象被认为是相等的,则它们的哈希码应该相同。这可以确保在使用哈希表时对象被正确地存储和检索。因此,在重写 hashCode() 方法时,必须确保相等的对象具有相同的哈希码。

3. 哈希码必须均匀分布

在哈希表中,不同的对象应该尽可能均匀地分布在不同的位置上。这可以确保哈希表的性能良好,避免出现哈希冲突。因此,在重写 hashCode() 方法时,必须确保返回的哈希码具有良好的分布性。

某为(BAT)二面:你重写过hashcode和equals么,要注意什么

以下是一个示例,展示了如何正确地重写 hashCode() 方法:

public class Person { private String name; private int age; // constructor, getters and setters @Override public int hashCode() { int result = 17; result = 31 * result + name.hashCode(); result = 31 * result + age; return result; } }

欢迎大家来到IT世界,在知识的湖畔探索吧!

在这个例子中,我们使用了一个常见的技巧,即将 `31` 作为一个乘数,将每个属性的哈希码加入到结果中。这个乘数的选择是基于它是一个奇素数,这有助于确保哈希码具有良好的分布性。同时,我们使用了一个初始值为 `17` 的变量 `result`,以确保哈希码在计算过程中不会受到初始值的影响。

重写equals方法

`equals()` 方法用于比较两个对象是否相等。它的返回值是一个 `boolean` 类型的值,如果两个对象相等,则返回 `true`,否则返回 `false`。重写 `equals()` 方法的主要目的是确保相等的对象被正确地识别。

以下是重写 `equals()` 方法时需要注意的几点:

1. 对象的类型必须匹配

在比较两个对象时,它们的类型必须相同。如果两个对象的类型不同,则它们不能相等。

2. 对象的内容必须相等

如果两个对象的内容相同,则它们应该被认为是相等的。在重写 `equals()` 方法时,必须比较对象的每个属性,以确保它们的内容相等。

3. 对称性、传递性、一致性

在实现 `equals()` 方法时,必须遵守以下规则:

  • 对称性:如果 `a.equals(b)` 返回 `true`,则 `b.equals(a)` 也必须返回 `true`。
  • 传递性:如果 `a.equals(b)` 和 `b.equals(c)` 都返回 `true`,则 `a.equals(c)` 也必须返回 `true`。
  • 一致性:如果 `a.equals(b)` 返回 `true`,则无论何时调用 `a.equals(b)`,它都必须返回 `true`。

以下是一个示例,展示了如何正确地重写 `equals()` 方法:

欢迎大家来到IT世界,在知识的湖畔探索吧!public class Person { private String name; private int age; // constructor, getters and setters @Override public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof Person)) return false; Person other = (Person) o; return Objects.equals(name, other.name) && age == other.age; } }

在这个例子中,我们首先检查对象是否是 this,如果是,则返回 true。然后我们检查对象是否是 Person 类型,如果不是,则返回 false。最后,我们比较对象的每个属性,以确保它们的内容相等。在比较字符串时,我们使用了 Objects.equals() 方法,这可以确保在比较字符串时不会抛出 NullPointerException 异常。

建议

以下是一些在重写 hashCode()equals() 方法时需要注意的建议:

1. 只比较不可变属性

只有不可变属性才应该用于计算哈希码和比较相等性。如果一个对象的属性是可变的,那么在计算哈希码和比较相等性时,它们可能会发生变化,从而导致问题。

2. 不要使用浮点数作为哈希码

由于浮点数的精度问题,不建议将它们用作哈希码。如果必须使用浮点数作为哈希码,则需要将其转换为整数,例如使用 Double.hashCode()Float.hashCode() 方法。

3. 使用Objects.equals方法比较对象

在比较对象的属性时,最好使用 Objects.equals() 方法,而不是使用 == 或者 equals() 方法。因为 Objects.equals() 方法可以处理 null 值,而 == 不能。

4. 遵循最佳实践

最后,我们应该遵循最佳实践,例如使用常见的哈希码算法,以及使用 @Override 注释来标识重写的方法。

某为(BAT)二面:你重写过hashcode和equals么,要注意什么

结论

重写 hashCode()equals() 方法是编写高质量 Java 代码的重要部分。它们可以确保对象被正确地识别和比较。在重写这些方法时,我们必须遵循特定的规则和最佳实践,以确保代码的正确性和健壮性。


免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/86642.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信