默认的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()` 是两个非常重要的方法,它们主要用于比较对象的平等性以及在散列数据结构(如 `HashMap`、`HashSet` 等)中的对象定位。当我们创建自定义类时,有时需要根据业务需求...
这种基于值的 Equal 方法可以由 Java 类库中的所有原始封装类使用。 为什么忽略 equals() 和 hashCode() 会带来问题 如果我们忽略 equals() 和 hashCode() 方法,那么我们将不能可靠地检索相关的值,除非我们在 ...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们与对象的比较和哈希表(如 `HashMap`)的操作密切相关。在面试中,面试官提出的问题直指这两个方法的重要关联。 首先,`equals()` ...
5、**为什么要重写hashCode()方法?** 当对象被放入哈希表时,`hashCode()`用于计算存储位置。如果两个对象`equals()`相等,它们的`hashCode()`也必须相等,以避免哈希冲突导致的性能下降。如果不重写`hashCode()`...
hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。 使用hashCode()和equals() hashCode()方法被用来获取给定对象的整数。这个整数被用来确定对象被...
Java中的`hashCode`方法是Java编程语言中的一个重要概念,它主要与对象的散列处理相关。在Java的`Object`类中定义了一个本地方法(native)`hashCode()`,该方法返回一个`int`类型的数值。这个数值是根据对象的状态...
ATM系统 Clone方法 toString方法:表示返回对象的字符串表示形式 包名.类名@hashCode(内存地址) 打印对象时,默认调用 如果不是想使用object类,toString...如果equal返回true的话,hashCode相同,重写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 ...
同时,为了保持哈希表的正确性,重写 `equals()` 时通常也需要重写 `hashCode()` 方法。 ```java @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || ...
1、何时需要重写equals() 当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。 2、为什么改写equals()的时候,总是要改写hashCode() 两个原则: hashCode()的返回值和equals()的关系...
* 43B:类中定义了 hashCode() 方法,但是没有重写 java.lang.Object 中的 hashCode() 方法 * 44C:类中定义了 tostring() 方法,但是没有重写 java.lang.Object 中的 tostring() 方法 * 45C:某些方法名只有大小写...
在Java中,正确使用和重写`equals`方法对于比较对象和在数据结构中查找对象至关重要。遵循通用约定和同时更新`hashCode`方法能确保一致性和正确性。通过理解和实践这些原则,开发者可以创建出更可靠、更具可维护性的...
Java编程中避免equals方法的隐藏陷阱介绍 Java编程中避免equals方法的隐藏陷阱介绍是一篇重要的技术文章,主要介绍了Java编程中避免equals方法的隐藏陷阱的技术。这篇文章将从equals方法的定义和重载开始,介绍了...
sun公司开源的jar包,里面封装了log4的日志以及关于自动生成hashcode代码以及重写equal方法的jar
在这个个人总结中,我们将探讨几个关键的Java知识点,包括对象创建、equals与hashCode方法、对象序列化以及String、StringBuffer和StringBuilder的区别。 首先,让我们来看看创建Java对象的四种方式: 1. **New**...
- Java中的访问修饰符,用来控制类、接口、变量、方法和构造器的访问级别。 1.25 Object - Object是Java类层次结构的根类,所有Java类都直接或间接继承自Object类。 1.26 equals和==的区别 - ==用于比较两个对象的...
在Java或其他面向对象的语言中,实现复杂对象的比较是一项重要任务,它通常涉及`equals()`方法和`hashCode()`方法的重写。 **1. `equals()`方法** `equals()`方法是Object类的一个成员方法,用于比较两个对象是否...
在Java中,`equals`方法用于比较两个对象的内容是否相等,而`hashCode`方法返回对象的哈希码。如果两个对象通过`equals`方法比较相等,则它们的`hashCode`也应该相同。但是,如果两个对象的`hashCode`相同,并不能...
这两个方法是Java中的基础方法,主要用于对象的比较和哈希表(如HashSet和HashMap)的操作。当我们在集合中存储自定义对象时,如果两个对象在逻辑上相等(即它们代表相同的信息),那么这两个对象的`equals`方法应该...
:类中定义了hashCode()方法,但是没有重写java.lang.Object中的hashCode()方法,这也有可能是有意这么做的。 FindBugs会检测到这种情况,并报告一个缺陷,提醒开发者检查代码中是否存在坏味道代码。 5. CNm: ...