key的hashcode与equals方法改写

get方法过程:首先计算key的hashcode,找到数组中对应位置的某一元素,然后通过key的equeals方法在对应的链表中找到需要的元素。所以,hashcode与equals方法对于找到对应元素是两个关键的方法。

HsahMap的key可以是任何类型,例如User对象,为了保证两个具有相同属性的User对象的hashcode相同,我们需要改写hashcode方法,比方说把hashcode的值的计算与User对象的id关联起来,那么只要user对象拥有相同的id,那么他们的hashcode就能保持一致了,这样就可以找到在hashmap数组中的位置了。如果这个位置上有多个元素,还需要用key的equals方法在对应位置的链表中找到需要的元素,所以只改写了hashcode方法是不够的,equals方法也是需要改写的。当然,按照正常逻辑,equals方法一般都会根据实际的业务内容来定义,例如根据user对象的id属性来判断两个对象是否相等。

在改写equals方法时,需要满足以下三点:

1)自反性:就是说a.equals(a)必须为true;

2)对称性:就是a.equals(b)为true,那么b.equals(a)也必须为true;

3)传递性:就是说a.equals(b)=true,并且b.equals(c)=true的话,a.equals(c)也必须为true。

通过改写key对象的equals和hashcode方法,我们可以将任意的业务对象作为map的key(前提是你确实有这样的需要。)

时间: 2024-10-15 02:36:02

key的hashcode与equals方法改写的相关文章

HashMap中使用自定义类作为Key时,为何要重写HashCode和Equals方法

之前一直不是很理解为什么要重写HashCode和Equals方法,才只能作为键值存储在HashMap中.通过下文,可以一探究竟. 首先,如果我们直接用以下的Person类作为键,存入HashMap中,会发生发生什么情况呢? public class Person { private String id; public Person(String id) { this.id = id; } } import java.util.HashMap; public class Main { public

为什么要重写hashcode和equals方法?初级程序员在面试中很少能说清楚。

我在面试 Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分,有没有放过自定义对象?而这个时候,候选人说放过,于是两个问题的回答就自相矛盾了. 最近问下来,这个问题普遍回答不大好,于是在本文里,就干脆从hash表讲起,讲述HashMap的存数据规则,由此大家就自然清楚上述问题的答案了. 1 通过Hash算法来了解HashMap对象的高效性 我们先复习数据结构里

(转)为什么要重写 hashcode 和 equals 方法?

作者丨hsm_computer cnblogs.com/JavaArchitect/p/10474448.html 我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分,有没有放过自定义对象?而这个时候,候选人说放过,于是两个问题的回答就自相矛盾了. 最近问下来,这个问题普遍回答不大好,于是在本文里,就干脆从hash表讲起,讲述HashMap的存数据规则

面试官:为什么要重写hashcode和equals方法?

 一个几乎必问的面试题  在面试 Java初级开发的时候,经常会问的一个问题是:你有没有重写过 hashcode方法?不少候选人直接说没写过.或许真的是没写过,于是还可以再通过一个问题确认:你在用HashMap的时候,键( Key)部分,有没有放过自定义对象?而这个时候,候选人说放过,于是两个问题的回答就自相矛盾了. 其实很多人这个问题普遍回答得都不大好,于是在本文里,就干脆 从 hash表讲起,讲述HashMap的存数据规则,由此大家就自然清楚上述问题的答案了.  再过一遍Hash算法  先复

重写hashCode与equals方法的作用

为了阐明其作用,我们先来假设有如下一个Person类. class Person { public Person(String name, int age) { this.name = name; this.age = age; } private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; }

hashcode和equals方法

分析: 1:Person类 1:姓名和年龄 2:重写hashCode和equals方法 1:如果不重写,调用Object类的equals方法,判断内存地址,为false 1:如果是Person类对象,并且姓名和年龄相同就返回true 2:如果不重写,调用父类hashCode方法 1:如果equals方法相同,那么hashCode也要相同,需要重写hashCode方法 3:重写toString方法 1:不重写,直接调用Object类的toString方法,打印该对象的内存地址 Person类 cl

如何重写hashCode()和equals()方法

hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们就讨论一下如何正解理解和使用这2个方法. 如何重写equals()方法 如果你决定要重写equals()方法,那么你一定要明确这么做所带来的风险,并确保自己能写出一个健壮的equals()方法.一定要注意的一点是,在重写equals()后,一定要重写hashCode()方法.具体原因稍候再进行说明. 我们先看看 JavaSE 7 Specification中

Java 中正确使用 hashCode 和 equals 方法

在这篇文章中,我将告诉大家我对hashCode和equals方法的理解.我将讨论他们的默认实现,以及如何正确的重写他们.我也将使用Apache Commons提供的工具包做一个实现. 目录: hashCode()和equals()的用法 重写默认实现 使用Apache Commons Lang包重写hashCode()和equals() 需要注意记住的事情 当使用ORM的时候特别要注意的 hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的jav

理解Java中的hashCode和equals 方法

在Java里面所有的类都直接或者间接的继承了java.lang.Object类,Object类里面提供了11个方法,如下: Java代码   ```` 1,clone() 2,equals(Object obj) 3,finalize() 4,getClass() 5,hashCode() 6,notify() 7,notifyAll() 8,toString() 9,wait() 10,wait(long timeout) 11,wait(long timeout, int nanos) ``