接重写equals 和hashCode 探解之洗洗脚(一)
public class User{
public String userName;
public String password;
public User(String userName,String password){
this.userName = userName;
this.password = password;
}
public static void main(String[] arg){
Set<User> users = new HashSet<User>(); //L1
User user=new User("lisa","ddd"); //L2
users.add(user); //L3
User user1=new User("lisa","ddd"); //L4
users.add(user1); //L5
System.out.println(“size---->"+users.size()); //L6
}
//重写hashCode和equals方法
public int hashCode(){
system.out.println("fn ----> hashCode");
return 1;
}
public boolean equals(){
system.out.println("fn ----> equals");
return true;
}
}
执行结果:
fn ----> hashCode
fn ----> hashCode
fn ----> equals
size---->1
分析: 在添加user 到users中,打印fn ----> hashCode 。原理见上篇文章。
L5: 添加user1到users中,hashCode()依然 return 1;因此可以理解为 在将user 放到第一个房间后,又准备将user1 放到同一个房间(即第一个房间user所在的房间,注意user此刻仍在第一个房间里睡觉哟)里去。
现在user1也准备进这个房间睡觉了,这时门禁就会开始判断了,你user和user1是不是同一个人啊? 是同一个人,我就让你进,不是那你就不是同一个人,我就不让你进来哟。
如果这个时候门禁是正常工作的,肯定就不让你进了,因为里面有人了啊,如果门禁处于损坏状态,那你就可以大摇大摆的闯进去YY了(嘿嘿),
那么门禁的好坏就要根据equals()方法来判断了,这里我们的equals 方法始终返回的是true ,说明门禁是永远处于正常工作的哟,你坏人休息进来YY。于是房间里就永远是一个人在睡觉了哟,呵呵(除非遇上了楼垮垮)
于是就打印了2次 fn ----> hashCode 和一次判定 fn ----> equals,当然size永远是1了。
------------------------------------------
public boolean equals(){
system.out.println("fn ----> equals");
return true;
}
如果我们此时将equals 方法的return false; 那门禁就坏掉了,那么坏人 user1就可以破门而入了,甚至还可以进入更多的“user1”.....
可想而知,打印的就是:
fn ----> hashCode
fn ----> hashCode
fn ----> equals
size---->2
因此我们根据不同的业务重写equals 方法,不同的条件返回不同的boolean ,就可以为所欲为的控制人员进出了。看来贿赂哈门禁的确比较爽哈。
继续
重写equals 和hashCode 探解之洗洗脚(三)
分享到:
相关推荐
以下是对`equals()` 和 `hashCode()` 方法的详细解释及其重写的重要性。 **1. equals() 方法** `equals()` 方法用于比较两个对象是否相等。默认情况下,`equals()` 检查两个对象是否是同一个对象(即内存地址是否...
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中的一个...
Java容器集合(equals和hashCode+基础数据结构+ArrayList+Vector和LinkedList) Java容器集合是Java中的一种基础数据结构,用于存储和管理数据。其中,equals和hashCode方法是Java容器集合中两个非常重要的方法,...
【面试】中提到的几个关键知识点集中在对象比较、equals()和hashCode()方法的使用以及它们之间的关系上。这些概念在Java编程中至关重要,特别是在处理集合类和比较对象时。 1、**hashCode与equals两者之间的关系**...
本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。
在 Java 编程语言中,Object 类是所有类的父类,但是在实际开发中,我们往往需要重写 Object 中的 equals 和 hashCode 方法,以便正确地比较对象的逻辑内容,而不是内存地址。下面我们将详细地解释为什么需要重写这...
如果我们只重写了 `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()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.