`
iamyuyingqiang
  • 浏览: 3144 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java中重写equal方法后重写hashCode方法

 
阅读更多

默认的equals只判断对象是不是同一个对象。

但是有时候即使不是同一个对象,我们也认为相等。例如我定义一个复数类,只要实部和虚部都相等,我就认为两个对象相等(即使它们不是同一个对象)。


最直接的例子是Collection。比如一个ArrayList,你判断其中有没有3+4i,你不需要自己写个循环,只要调用list.contains(new Complex(3,4))就可以知道list里有没有3+4i这个对象。这个contains方法就调用了equals来比较。如果你不重写equals(),这永远都返回false。

hashCode()需要重写的一个原因是Hash表。我们知道java里用HashTable和HashMap这些方便的数据结构可以直接用。我们往一个hash表里插入一个元素的时候,hash表通过hashCode来得到hash值,从而找这个元素来插入。同样例子,如果我们用Complex类做键,例如你想要3+4i对应一个值5,你以3+4i为主键每插入一次,应该都插入到同一位置。因为每个hashCode()函数对于3+4i都应该返回相同的值。可如果你只重写了equals()而不重写hashCode(),每个新的3+4i都返回新的hashCode(),你就会插入许多个3+4i.


所以你可以不重写equals(极其少的情况下),但只要重写了equals(),一定要重写hashCode,否则Hash表都会失效,工作不正常。


很多java新手用java写数据结构作业的时候,都会忘记写eqals()和hashCode(),结果后来会发现java的hash表有许多奇怪的问题:)

分享到:
评论

相关推荐

    java中重写equals和重写hashCode()

    在Java编程语言中,`equals()` 和 `hashCode()` 是两个非常重要的方法,它们主要用于比较对象的平等性以及在散列数据结构(如 `HashMap`、`HashSet` 等)中的对象定位。当我们创建自定义类时,有时需要根据业务需求...

    关于hashCode()和equals()的本质区别和联系

    这种基于值的 Equal 方法可以由 Java 类库中的所有原始封装类使用。 为什么忽略 equals() 和 hashCode() 会带来问题 如果我们忽略 equals() 和 hashCode() 方法,那么我们将不能可靠地检索相关的值,除非我们在 ...

    面试官瞬间就饱了,重写equals函数,需要重写hashCode函数吗?

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们与对象的比较和哈希表(如 `HashMap`)的操作密切相关。在面试中,面试官提出的问题直指这两个方法的重要关联。 首先,`equals()` ...

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

    5、**为什么要重写hashCode()方法?** 当对象被放入哈希表时,`hashCode()`用于计算存储位置。如果两个对象`equals()`相等,它们的`hashCode()`也必须相等,以避免哈希冲突导致的性能下降。如果不重写`hashCode()`...

    Java中hashCode和equals方法的正确使用

     hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。  使用hashCode()和equals()  hashCode()方法被用来获取给定对象的整数。这个整数被用来确定对象被...

    Java中的hashcode方法介绍

    Java中的`hashCode`方法是Java编程语言中的一个重要概念,它主要与对象的散列处理相关。在Java的`Object`类中定义了一个本地方法(native)`hashCode()`,该方法返回一个`int`类型的数值。这个数值是根据对象的状态...

    javaee_tedu_day09.zip

    ATM系统 Clone方法 toString方法:表示返回对象的字符串表示形式 包名.类名@hashCode(内存地址) 打印对象时,默认调用 如果不是想使用object类,toString...如果equal返回true的话,hashCode相同,重写hashCode方法

    关于重写equals()为什么一定要重写hashcode()自己的一点心得

    首先我们看下下面代码及输出和String重写equals和hashcode的源码: package com.zzy.test; public class Test6 { public static void main(String[] args) { String s1="aaa"; String s2="aaa"; String s3=new ...

    java中 == 与 equal 的区别讲解

    同时,为了保持哈希表的正确性,重写 `equals()` 时通常也需要重写 `hashCode()` 方法。 ```java @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || ...

    Java中equals()与hashCode()的原理与设计

    1、何时需要重写equals()  当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。  2、为什么改写equals()的时候,总是要改写hashCode()  两个原则:  hashCode()的返回值和equals()的关系...

    Findbugs缺陷等级对照表.pdf

    * 43B:类中定义了 hashCode() 方法,但是没有重写 java.lang.Object 中的 hashCode() 方法 * 44C:类中定义了 tostring() 方法,但是没有重写 java.lang.Object 中的 tostring() 方法 * 45C:某些方法名只有大小写...

    Java中Equals使用方法汇总

    在Java中,正确使用和重写`equals`方法对于比较对象和在数据结构中查找对象至关重要。遵循通用约定和同时更新`hashCode`方法能确保一致性和正确性。通过理解和实践这些原则,开发者可以创建出更可靠、更具可维护性的...

    Java编程中避免equals方法的隐藏陷阱介绍

    Java编程中避免equals方法的隐藏陷阱介绍 Java编程中避免equals方法的隐藏陷阱介绍是一篇重要的技术文章,主要介绍了Java编程中避免equals方法的隐藏陷阱的技术。这篇文章将从equals方法的定义和重载开始,介绍了...

    sun公司开源jar -log.jar

    sun公司开源的jar包,里面封装了log4的日志以及关于自动生成hashcode代码以及重写equal方法的jar

    java个人总结.docx

    在这个个人总结中,我们将探讨几个关键的Java知识点,包括对象创建、equals与hashCode方法、对象序列化以及String、StringBuffer和StringBuilder的区别。 首先,让我们来看看创建Java对象的四种方式: 1. **New**...

    Java面经.适用于校招

    - Java中的访问修饰符,用来控制类、接口、变量、方法和构造器的访问级别。 1.25 Object - Object是Java类层次结构的根类,所有Java类都直接或间接继承自Object类。 1.26 equals和==的区别 - ==用于比较两个对象的...

    复杂对象的比较

    在Java或其他面向对象的语言中,实现复杂对象的比较是一项重要任务,它通常涉及`equals()`方法和`hashCode()`方法的重写。 **1. `equals()`方法** `equals()`方法是Object类的一个成员方法,用于比较两个对象是否...

    java面试题目 想要的拿去吧

    在Java中,`equals`方法用于比较两个对象的内容是否相等,而`hashCode`方法返回对象的哈希码。如果两个对象通过`equals`方法比较相等,则它们的`hashCode`也应该相同。但是,如果两个对象的`hashCode`相同,并不能...

    学生集合排序

    这两个方法是Java中的基础方法,主要用于对象的比较和哈希表(如HashSet和HashMap)的操作。当我们在集合中存储自定义对象时,如果两个对象在逻辑上相等(即它们代表相同的信息),那么这两个对象的`equals`方法应该...

    Findbugs缺陷等级对照表

    :类中定义了hashCode()方法,但是没有重写java.lang.Object中的hashCode()方法,这也有可能是有意这么做的。 FindBugs会检测到这种情况,并报告一个缺陷,提醒开发者检查代码中是否存在坏味道代码。 5. CNm: ...

Global site tag (gtag.js) - Google Analytics