`
colincome
  • 浏览: 6356 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

重写equals 和hashCode 探解之洗洗脚(三)

    博客分类:
  • JAVA
 
阅读更多
接下来看看重写equals 和hashCode 探解之洗洗脚(三)

对于以下代码:

public class User{   
     static int index = 0;
     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 index++;   
     }   
        
     public boolean equals(){   
         system.out.println("fn ----> equals");   
         return true;   
     }   
  
}   




我们在代码中添加了 static int index = 0; 和 在hashCode 方法中 return index++;

执行:

fn ----> hashCode
fn ----> hashCode
2



为什么没有执行 fn-----> equals 呢?、 难道在加入其它对象之前不用判断其是不是同一个对象了么? 而且equals()返回的是true啊,标明门禁是好的啊。那为什么数量是2呢?


答案: 还记得我们在hashCode()方法中的return index++ 了么? 即每次返回的int类型都是不一样的。即每次添加user对象到set中的时候,都是在set中另外开辟一个房间给传入的user 对象。

所以,既然每个USER都入住不同的房间,就不存在同一个房间住2个人需要门禁来判断了撒。

因此这里将永远不会调用 equals()方法了,也就不会打印 fn------->equals 了。

而set是无限扩大空间的。因此就加多少人进来,我就给你分配多少个房间。哈哈(直到内存吃光哈哈)

于是这里就回答了Q4:equals方法和hashCode方法调用的顺序是怎样的? 以及2个方法被调用的时机? 2个方法会不会有可能不被调用?或者必须2者中的某一个是不是一定会被调用?



总结:因此要不要你进来,就靠我怎样return int和return boolean了。

永远进来就 return false或者 return int(变化的数字)就OK了.
只进一个就 return true和return  int(固定不变数字)就Ok了。

感谢嘉宾徐老师。
0
1
分享到:
评论
3 楼 colincome 2010-01-02  
pengjunwu 写道
大哥,你错啦!因为hashset集合是不允许重复元素的,在add的时候会先判断是否重复,顺序是这样的:
先判断hashcode 如果相等才去用equals判断(因为hashcode相等不一定equals为true)
如果hashcode不相等的话则可以判断出其equals一定是false也就是不相等的不重复的元素了
set接口是无序非重复的 hashset中add时 是通过其元素的hashcode定位其存储的位置的,先计算其hashcode去看对应位置上是否已经有元素了,如果没有则直接add;
当发现该位置上已经有元素的话则拿已存的元素与要存的元素做比较是否是同一元素如果是相同元素的话则不存,如果是不同的元素的话就继续散列(存在冲突)



嘿嘿,感谢的你正解。
貌似我想阐述的和你说的是一样的,难道是我没有清楚的表达出来。
2 楼 pengjunwu 2009-12-30  
其实重写hashcode函数只是提高比较效率有没有无所谓(类都继承了Object的hashcode方法)
还有比较元素是否重复还是看equals的返回值。
1 楼 pengjunwu 2009-12-30  
大哥,你错啦!因为hashset集合是不允许重复元素的,在add的时候会先判断是否重复,顺序是这样的:
先判断hashcode 如果相等才去用equals判断(因为hashcode相等不一定equals为true)
如果hashcode不相等的话则可以判断出其equals一定是false也就是不相等的不重复的元素了
set接口是无序非重复的 hashset中add时 是通过其元素的hashcode定位其存储的位置的,先计算其hashcode去看对应位置上是否已经有元素了,如果没有则直接add;
当发现该位置上已经有元素的话则拿已存的元素与要存的元素做比较是否是同一元素如果是相同元素的话则不存,如果是不同的元素的话就继续散列(存在冲突)

相关推荐

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    以下是对`equals()` 和 `hashCode()` 方法的详细解释及其重写的重要性。 **1. equals() 方法** `equals()` 方法用于比较两个对象是否相等。默认情况下,`equals()` 检查两个对象是否是同一个对象(即内存地址是否...

    Java重写equals同时需要重写hashCode的代码说明

    Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.

    关于重写equals,hashcode以及compareTo方法!

    重写equals()、hashcode()和compareTo()方法是非常重要的,它可以使我们的程序更加高效、可靠和灵活。在实际开发中,我们需要根据具体情况来决定是否需要重写这些方法,并遵守相关的规则,以避免出现意想不到的结果...

    Java_重写equals()和hashCode()

    当同时重写 `equals()` 和 `hashCode()` 时,需要注意的一点是,如果 `equals()` 返回true,那么两个对象的 `hashCode()` 必须相等。反之则不一定,因为不同的对象可能会产生相同的哈希码。这就是为什么在设计类时,...

    equals与hashCode在实际开发中的重写写法

    总结来说,`equals()` 和 `hashCode()` 在实际开发中的重写是提高代码质量、确保对象比较和哈希表操作正确性的关键。开发者需要根据业务需求来定制这两个方法,确保它们遵循上述原则,并与业务逻辑保持一致。

    Java重写equals及hashcode方法流程解析

    三、重写equals和hashCode方法 在实际开发中,我们经常需要重写equals和hashCode方法,以便于正确地比较和存储对象。下面是一个简单的示例代码: public class Student { private String name; private int age;...

    equals,hashcode,toString

    在Java编程语言中,`equals()`, `hashCode()` 和 `toString()` 是三个非常重要的方法,它们主要用于对象的比较、哈希存储以及打印对象信息。这三个方法是Java对象的基础特性,对于理解和开发高质量的Java程序至关...

    重写hashCode()和equals()方法详细介绍

    如果我们重写了`equals()`方法来基于`name`和`age`判断两个`Coder`对象是否相等,那么我们也应该重写`hashCode()`,使具有相同`name`和`age`的`Coder`对象产生相同的哈希码。通常,`hashCode()`的实现会结合所有参与...

    重写equals方法

    第二种情况:对于采用哈希算法的集合,集合中对象必须重写 hashCode 方法,同时也要重写 equals 方法。这是因为哈希算法需要使用 hashCode 方法来计算对象的哈希值,而 equals 方法用于判断两个对象是否相等。 如何...

    Java中equals,hashcode和==的区别

    "Java中equals、hashcode和==的区别" Java 中 equals、hashcode 和==的区别是 Java 编程语言中一个经常遇到的问题。这三个概念都是用来比较对象的,但是它们之间存在着本质的区别。 首先,==号是Java中的一个...

    Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)

    其中,equals和hashCode方法是Java容器集合中两个非常重要的方法,本文将详细介绍这两个方法,并结合ArrayList、Vector和LinkedList三个常见的容器集合。 一、equals方法 equals方法是Java中用于比较两个对象是否...

    【面试】hashCode与equals两者之间的关系 / == 和equals / 为什么要重写equals方法 / 重写equals /hashcode方法 / 为什么要重写hashCode方法

    【面试】中提到的几个关键知识点集中在对象比较、equals()和hashCode()方法的使用以及它们之间的关系上。这些概念在Java编程中至关重要,特别是在处理集合类和比较对象时。 1、**hashCode与equals两者之间的关系**...

    Java理论与实践:hashCode()和equals()方法

    本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。

    学习Object类——为什么要重写equeals和hashcode方法

    在 Java 编程语言中,Object 类是所有类的父类,但是在实际开发中,我们往往需要重写 Object 中的 equals 和 hashCode 方法,以便正确地比较对象的逻辑内容,而不是内存地址。下面我们将详细地解释为什么需要重写这...

    why在重写equals时还必须重写hashcode方法分享

    如果我们只重写了 `equals()` 来比较姓名和年龄,而没有重写 `hashCode()`,那么即使两个 `Person` 实例具有相同的姓名和年龄,它们在哈希表中的位置也可能不同,导致不必要的比较和潜在的性能问题。 总结来说,...

    equals与hashCode方法讲解

    equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的。equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java 的 Object 类中,equals 方法...

    为什么重写equals方法,还必须要重写hashcode方法

    为什么重写equals方法,还必须要重写hashcode方法

    如何在IDEA中对 hashCode()和 equals() 利用快捷键快速进行方法重写

    IntelliJ IDEA,作为一款强大的Java集成开发环境,提供了便捷的快捷键功能来帮助开发者快速重写`hashCode()`和`equals()`。 在IDEA中,如果你需要对一个类(比如`Student`类)重写这两个方法,可以遵循以下步骤: ...

    Java中的equals和hashCode方法详解1

    在Java编程语言中,`equals()`和`hashCode()`方法是对象的基本组成部分,它们主要用于对象的比较和存储。这两个方法在`java.lang.Object`类中定义,因此所有的Java类都默认继承了这两个方法。然而,根据具体的应用...

    hashcode和equals方法

    equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.

Global site tag (gtag.js) - Google Analytics