当你要重写对象的equals方法时,你必须重写该对象的hashcode方法.
两个对象之间要互相equals的话,就必有具备相同的hashcode.
Set的存储机制是equals与hashcode相结合的。一般ADD一个对象会先根据equals方法判断与其他对象是否相等,因为Set是不允许重复add的。如你不覆盖equals方法,JAVA默认所有的对象都是不同的,也就是它们的内存地址。假如你NEW一个对象,人,你认为只要它们名字相同就是同一个对象,此时你就需要覆盖equals方法了,否则同名也是两个对象。java先通过equals方法判断存储位置,如果不同直接存入;如果通过equals方法比较现在要存入的对象与结合中的某个对象相等,那么它就会再根据hashcode来判断它们是否hashcode也相等,如果相等那就存不进去了,说明它们确实是同一个对象,不等就可存入。所以一般在写程序的时候,两个对象你认为它们不同就去覆盖equals方法。这样可以提高效率,不要让JAVA再去判断hashcode
一般你需要比较两个对象是否相等时需重写equals方法,一般在编写领域和实体对象时需重写equeals和hashCode
但什么时候应该重写呢?
比如:你向 Set 集合中添加一个一个Person 对象 如果 这个Person 对象的
name 相同就认为是同一个对象的话。那么你就必须同时重写 hashCode,和equals 方法。
Set 集合是不可以包含重复元素的
Person p1 = new Person("abc");
Person p2 = new Person("abc");
p1 ,p2 加到Set 集合中 会是两个对象。
但事实上是 同一个人。
这时就必须重写。
equeals和hashCode方法有必然联系吗?
----
在Java的规范中规定了有必然的联系, 即 如果 a.equals(b),那么必定有 a.hashCode() == b.hashCode(),反之【不一定成立】
如果不满足这个条件则map, set等的处理会出现错误的
这是一个规范。
原文地址:http://topic.csdn.net/u/20080421/17/51b2a8e6-e057-4694-a6e3-880d6fe55367.html
分享到:
相关推荐
总的来说,理解并正确地重写 `equals()` 和 `hashCode()` 方法是Java编程中的基础技能,它有助于确保对象的比较和集合操作的正确性。在开发过程中,要时刻注意这两个方法的正确实现,以提高代码质量和可维护性。
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
重写equals()、hashcode()和compareTo()方法是非常重要的,它可以使我们的程序更加高效、可靠和灵活。在实际开发中,我们需要根据具体情况来决定是否需要重写这些方法,并遵守相关的规则,以避免出现意想不到的结果...
当同时重写 `equals()` 和 `hashCode()` 时,需要注意的一点是,如果 `equals()` 返回true,那么两个对象的 `hashCode()` 必须相等。反之则不一定,因为不同的对象可能会产生相同的哈希码。这就是为什么在设计类时,...
总结来说,`equals()` 和 `hashCode()` 在实际开发中的重写是提高代码质量、确保对象比较和哈希表操作正确性的关键。开发者需要根据业务需求来定制这两个方法,确保它们遵循上述原则,并与业务逻辑保持一致。
在实际开发中,我们经常需要重写equals和hashCode方法,以便于正确地比较和存储对象。下面是一个简单的示例代码: public class Student { private String name; private int age; private String QQ; @...
在这个类中,很可能已经重写了`equals()`, `hashCode()` 和 `toString()` 方法,以便更好地处理对象的比较、哈希存储和输出信息。 为了实现`DBObject`类的正确行为,开发者可能考虑了以下几点: 1. 在`equals()`...
第二种情况:对于采用哈希算法的集合,集合中对象必须重写 hashCode 方法,同时也要重写 equals 方法。这是因为哈希算法需要使用 hashCode 方法来计算对象的哈希值,而 equals 方法用于判断两个对象是否相等。 如何...
如果我们重写了`equals()`方法来基于`name`和`age`判断两个`Coder`对象是否相等,那么我们也应该重写`hashCode()`,使具有相同`name`和`age`的`Coder`对象产生相同的哈希码。通常,`hashCode()`的实现会结合所有参与...
"Java中equals、hashcode和==的区别" Java 中 equals、hashcode 和==的区别是 Java 编程语言中一个经常遇到的问题。这三个概念都是用来比较对象的,但是它们之间存在着本质的区别。 首先,==号是Java中的一个...
重写equals方法需要遵守通用约定,hashCode方法的实现需要保证equals相同的两个对象的hashCode结果一致。ArrayList、Vector和LinkedList是Java中三种常见的容器集合,每种集合都有其特点和应用场景。
【面试】中提到的几个关键知识点集中在对象比较、equals()和hashCode()方法的使用以及它们之间的关系上。这些概念在Java编程中至关重要,特别是在处理集合类和比较对象时。 1、**hashCode与equals两者之间的关系**...
此外,Object 类的设计是为了扩展,它提供了一些非 final 方法,如 equals、hashCode、toString、clone 和 finalize,这些方法都有通用的约定,需要在子类中被覆盖(override)。如果不遵守这些约定,依赖这些约定的...
如果我们只重写了 `equals()` 来比较姓名和年龄,而没有重写 `hashCode()`,那么即使两个 `Person` 实例具有相同的姓名和年龄,它们在哈希表中的位置也可能不同,导致不必要的比较和潜在的性能问题。 总结来说,...
equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的。equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java 的 Object 类中,equals 方法...
为什么重写equals方法,还必须要重写hashcode方法
IntelliJ IDEA,作为一款强大的Java集成开发环境,提供了便捷的快捷键功能来帮助开发者快速重写`hashCode()`和`equals()`。 在IDEA中,如果你需要对一个类(比如`Student`类)重写这两个方法,可以遵循以下步骤: ...
在Java编程语言中,`equals()`和`hashCode()`方法是对象的基本组成部分,它们主要用于对象的比较和存储。这两个方法在`java.lang.Object`类中定义,因此所有的Java类都默认继承了这两个方法。然而,根据具体的应用...
关于 equals 和 hashCode 方法的规范有两个: 1. 如果重写 equals 方法,那么也应该重写 hashCode 方法,以便确保 equals 方法返回 true 的两个对象拥有相同的 hashCode 值。 2. 如果两个对象不相同,那么它们的 ...
如果一个类重写了`equals()`却没有重写`hashCode()`,可能会导致违反JavaDoc的建议,即`equals()`和`hashCode()`必须保持一致。这意味着,如果两个对象`equals()`返回`true`,那么它们的`hashCode()`也必须相同。...