为什么要重写hashcode方法

我看老师新建类的时候比如student类这样总是要重写hashcode和equals方法,但是他说还不重写也行,没搞懂

0

5个回答

如果该类需要使用HashSet或者HashMap等集合存储时,需要重写。引用哈希散列算法会先根据哈希值验证是否一样,如果一样再调用equals

0

主要原因是默认从Object继承来的hashCode是基于对象的ID实现的。

如果你重写了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样。
这样,当你用其中的一个作为键保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一个作为键值去查找他们的时候,则根本找不到。

0

参考:http://tool.oschina.net/apidocs/apidoc?api=jdk-zh

下面的两个方法来自:java.lang.Object 类.

 equals

public boolean equals(Object obj)
指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:

自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false。
另请参见:
hashCode(), Hashtable


// hashCode------------------------------------------------

hashCode

public int hashCode()
返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。
hashCode 的常规协定是:

在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

返回:
此对象的一个哈希码值。
另请参见:
equals(java.lang.Object), Hashtable

0
qq_39632416
yunyuntop 重写之前hashcode是地址转化的,重写之后是对象内容转化的吗,那比较两个对象的时候岂不是比较hashcode就可以了,要equals干啥
接近 2 年之前 回复
dcxy0
Q544471255 jdk1.6的文档,稍微有点老.不过还可以凑合看一下.
接近 2 年之前 回复

两个对象a.equals(b)中,equals判断是否相同,hashCode相当于对象索引,索引相同会放在同一个链表中,效率会变差。如果你不需要判断两个对象相等,可以不写。或者不需要hashcode,可以自己写个方法:
public boolean isEquals(Student stu){
if(stu.getId()==getId)
return true;
return false;
}

0

equals对象做比较,hashCode计算int值并返回,你们老师老是要重写是因为:所有类默认继承父类Object,想比较想计算值,就按照父类的规范重写,这个叫主流
如果你们在教学阶段,那倒不必重写,因为仅仅是学习,没必要没创建一个类就重写又不是做项目做例题,额,你们老师没将清楚把,

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
为什么重写equals一定要重写hashcode?
大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白,以下是我的一些个人理解。这是Object类关于这两个方法的源码,可以看出,Object类默认的equals比较规则就是比较两个对象的内存地址。而hashcode是本地方法,java的内存是安全的,因此无法根据散列码得到对象的...
为什么要同时重写hashcode和equals方法
HashCode和Equals都是object的方法在jdk中源码如下: 原始的这两个方法equals是比较引用。 hashcode是调用native方法根据这个对象在内存中的实际地址值来算的一个哈希码值。 所以要么都相等,要么都不相等,所以重写的时候应该都重写下,否则可能就不一致了,如果不一致的话,对使用散列表数据结构的数据类型会有影响,比如hashmap,hashta
简单理解java为什么要同时重写equals方法和hashcode
一、从集合和数据结构说起       这几天在博客上看关于为什么重写equals方法的同时也要重写hashcode方法,越看越糊涂,后来自己仔细一想,本来很简单的事情为何说的那么麻烦。现在我来一一说说我的理解。     在数据结构中我们学习过查找,但是实践的比较少。而java集合正是利用了这个查找。     什么是查找?就是给你1个值在成千上万的记录中找到他。     主要有两种查找:顺序
为什么要重写java中对象的equals方法和hashCode方法以及如何重写
为什么要重写hashCode和equals方法以及如何重写
为什么要重写hashcode和equals方法?
为什么要重写hashcode和equals方法? 相信很多小伙伴被这个问题给困扰很久了,下面我就给大家详细说一下我的理解吧~ 因为默认的hequals方法是Object的方法,比较的是内存地址;而默认的hashcode方法返回的是对象的内存地址转换成的一个整数,实际上指的的也是内存,两个方法可以理解为比较的都是内存地址,这在实际开发的过程中在hashmap或者hashs
java为什么要重写hashCode和equals方法
如果不被重写(原生)的hashCode和equals是什么样的?       不被重写(原生)的hashCode值是根据内存地址换算出来的一个值。      不被重写(原生)的equals方法是严格判断一个对象是否相等的方法(object1 == object2)。   为什么需要重写equals和hashCode方法?       在我们的业务系统中判断对象时有时候需要的不是一种严格意
深入详解SetHash的元素为什么要重写hashCode和equals方法
在Object这个类中hashCode是本地方法,它的值与对象在内存中的地址有关,所以不会存在两个hashCode返回值相同的对象,equals是比较对象的引用是否相等hashCode方法的目的是什么呢? —它是为hash table中插入为提供hash数值SetHash:一个是无序不重复的集合,你知道为什么吗? 因为SetHash根据hashCode返回值和equals来判断两个对象是否相同(
自定义对象的比较为什么重写equals和hashcode
类比String String是我们最常见的一种类型,它同时也很特殊,先不管它的特殊性,我们来看看它的equals方法 String的equals方法 其实,我们在调用改方法时,内部就进行对象的引用地址的判断。 String的hashcode方法 ...
为什么重写了equals()之后还要重写hashCode()
我们知道equals()和hashCode()是java Object中两个基本方法,有时候由于业务的需求,需要我们重写equals()方法,比如对于Person类中,业务的需要让我们当Person对象的cardID一致的时候,就认为两个对象equals,此时就需要在Person类中重写equals()方法,如下: public class Person { public St
为什么重写equals时还必须重写hashcode方法
为什么重写equals时还必须重写hashcode方法 先看一个例子 A package other.equals; public class A { @Override public boolean equals(Object obj) { return true; } } B package other.equals; publi...
2019Java面试题:为什么使用hashmap需要重写hashcodes和equals方法?
总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。你知道它们的区别吗?前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?这就是Object.equals方法了。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数...
详解重写equals()方法就必须重写hashCode()方法的原因
重写的作用: 如果重写(用于需求,比如建立一个Person类,比较相等我只比较其属性身份证相等就可不管其他属性,这时候重写)equals,就得重写hashCode,和其对象相等保持一致。如果不重写,那么一定保持一致。 1. 重写equals()方法就必须重写hashCode()方法主要是针对HashSet和Mao集合类型。集合框架只能存入对象(对象的引用(基本类型数据:自动装箱))。 在向HashSet集合中存入一个元素时,HashSet会调用该对象(存入对
重写equals方法必须重写hashcode
equals方法定义在java的根类Object类,定义如下public boolean equals(Object obj) { return (this == obj); }比较的是引用,也就是对象的地址是否相等,equals在非空对象上需要满足以下特性:1.自反性:x.equals(x) == true,自己和自己比较相等2.对称性:x.equals(y) == y.equa...
为什么要重写了equals方法后一定要重写hashcode方法
重写了equals方法一定要重写hashcode方法,原因在于用到hash来提高效率的集合类在插入对象时先比较对象的hashcode是否相同,若相同再比较equals是否相同,若hashcode不同j就不再比较equals。 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法:
为什么在重写equals()方法时,一般都会重写HashCode()方法?
重写equals()方法主要是为了方便比较两个对象内容是否相等。hashCode()方法用于返回调用该方法的对象的散列码值,此方法将返回整数形式的散列码值。 一个类如果重写了 equals()方法,通常也有必要重写 hashCode()方法,目的是为了维护hashCode()方法的常规协定,该协定声明相等对象必须具有相等的散列码。hashCode 的常规协定主要有以下几点。 □ 在 Java 应用...
HashSet为什么要重写equals和tohashcode方法
hashset为了确保值的唯一性,会对对象的哈希值取模,来确定对象应该放的位置,如果对象的取模后哈希值相等,我们会 再进行equals判断,如果返回true则丢弃,如果返回false,证明两个对象不相等,那么我们会用链表的形式,在这个值的后面追加另一个值。这就达到了对象的唯一性。重写的意义,在于我们的hashset会调用这两个方法进行判断。public class test01 extends O...
重写equals方法后重写hashCode方法的必要性
1、首先我们看看对象默认的(Object)的equals方法和hashcode方法 public booleanequals(Object obj) { return(this== obj); } public native inthashCode(); 对象在不重写的情况下使用的是Object的equals方法和hashcode方法,从Object类的源码我们知道,默认的equals ...
为什么重写equals方法时必须重写hashcode方法
java编程里有关约定:如果两个对象根据equals方法比较是相等的,那么调用这两个对象的任意一个hashcode方法都必须产生相同的结果。 因为没有重写hashcode而导致违反了这一条约定。 举个栗子。 在学校中,是通过学号来判断是不是这个人的。 下面代码中情景为学籍录入,学号 123 被指定给学生 Tom,学号 456 被指定给学生 Jerry,学号 123 被失误指定给 Lily。...
JavaBean关于为什么要重写hashCode()方法和equals()方法及如何重写
记得有一次去面试Java软件开发工程师,面试官问了我一个关于JavaBean为什么要重写hashCode()方法和equals方法,我记得当时我巴拉巴拉半天就是没有说到重点,现在想一想归根到底还是我对这两个的理解不深刻,现在我特定来总结下.hashCode 方法用于散列集合的查找,equals 方法用于判断两个对象是否相等。 一、我们为什么需要重写hashCode()方法和equals()方法?...
在比较对象的时候为什么要重写equls()与hashCode()方法
-
8.HashMap添加的对象为什么要重写equals和hashcode
浅谈HashMap以及重写hashCode()和equals()方法因为,equals()方法只比较两个对象是否相同,相当于==,而不同的对象hashCode()肯定是不同,所以如果我们不是看对象,而只看对象的属性,则要重写这两个方法,如Integer和String他们的equals()方法都是重写过了,都只是比较对象里的内容。使用HashMap,如果key是自定义的类,就必须重写hashcode...
为什么重写equals()就一定要重写hashCode()方法?
如果涉及使用对象作为key,那么key的对象都必须实现hashCode和equals方法。hashCode和equals方法持续自根类Object,若是你用自定义的类算作key的话,就需要同时覆写equals办法和hashCode方法,因为我们java的集合中判断两个对象是否相等,是根据hashCode和equals这个俩个方法。规则是先判断两个对象的hashCode是否相等,如果不相等,认为两个对
Java重写equals方法必须重写hashcode方法的意义
很多人都说这样的一件事情:       重写equals方法要注意:若两个对象equals判断为true时,则这两个对象的hashcode也要必须相等。   但是为什么一定要这样做?不这样做会出现什么问题?   假设: 有对象a,和对象b,  a.equals(b) 为true, a.hashcode()  与b.hascode()不相等。 -------------------...
java中重写equals()方法的时候为什么要重写hashCode()方法?
有时候,或许会听到被人说,在重写equals方法的时候,记得重写hashcode方法。那么自然有这样的疑问,那么为什么这样?equals方法和hashCode方法是什么关系?不重写的时候会有什么危害?文章将从一下几个方面进行叙述。 一:什么是hashCode(),equals()方法? 二:hashCode(),equal()s两种方法是什么关系? 三:为什么在重写equals方法的
为什么重写equals方法就要重写hashcode方法
有这样一个场景,我们要将很多学生加入到一个set集合中,年龄,姓名相同的视为同一个学生。下面是student类的代码,我们只重写了equals方法。 下面将学生添加到set中: 发现我们自定义两个相同学生都加进去set集合中。set集合添加元素首先根据hashcode加,如果hashcode不一样,肯定都把元素加进去,如果hashcode一样,再用equals比较,如果相同,则不会
比较两对象为什么要重写hashCode()方法
比较两对象为什么要重写hashCode()方法两个对象相等的时候,hashCode必须相等,但hashCode相等,对象不一定相等有没有可能两个不相等的对象有有相同的 hashcode
(java面试)为什么重写equals的时候一般要重写hashcode
支持原创,转载自:http://blog.csdn.net/fenglibing/article/details/8905007 hashcode是用来查找的,如果学过数据结构就应该知道,在查找和排序这一章有   例如内存中有这样的位置   0  1  2  3  4  5  6  7     而我有个类,这个类有个字段叫ID,我要把这个类存放在以上8个位置之一,如果不用hashcode而
重写equal()时为什么也得重写hashCode()之深度解读equal方法与hashCode方法渊源
今天这篇文章我们打算来深度解读一下equal方法以及其关联方法hashCode(),我们准备从以下几点入手分析: 1.equals()的所属以及内部原理(即Object中equals方法的实现原理) 说起equals方法,我们都知道是超类Object中的一个基本方法,用于检测一个对象是否与另外一个对象相等。而在Object类中这个方法实际上是判断两个对象是否具有相同的引用,
object对象重写equals方法时为什么需要重写hashCode方法
在Java语言中,equals方法在使用时:     针对包装对象,比较的是对象的值(包括 boolean,byte,char,short,int,long,float,double)     针对String对象,比较的也是String的值(因为String内部重写了equals方法和hashCode方法)     针对其他object对象,比较的是两个对象的引用是否指向同一个内存地址
为什么在重写equals方法时还必须重写hashcode方法
首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法 public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String)
关于为什么要重写hashCode()方法和equals()方法及如何重写
我想写的问题有三个: 1、首先我们为什么需要重写hashCode()方法和equals()方法 2、在什么情况下需要重写hashCode()方法和equals()方法 3、如何重写这两个方法 ********************************************************************* 第一个问题:为什么需要重写hashCode()方法和equ
(Java)重写equal方法的时候为什么要重写hashcode的方法
在HashMap中的get(Object key)的执行流程 在HashMap中get(Object key) 计算key的hashcode(),等到一个整数n 然后用这个n%(length)【length代表当前map的最大的容量】=index 用index作为下标,得到hashmap内部的桶的结构中位于index处的链表list(Java1.8中有可能是红黑树,这里用链表代替。) 然后循环遍...
使用HashSet存储自定义类对象时为什么要重写equals和hashCode方法?
  在Java集合的运用中,HashSet抽象类实现了Set接口,我们可以通过HashSet存储Java中定义过的类创建的对象,当然也可以存储我们自定义的类创建的对象。   但是在存储自定义类创建的对象时,就会遇到实际问题导致的漏洞;首先,我们分析一下HashSet类中add()、remove()、contains()方法对同一个对象的判断机制: HashSet集合对象如何判断数据元素是否重...
重写equels()后需重写hashcode()的意义
sun对于eqauls方法和hashCode方法是这样规定的: 1、如果两个对象相同,那么它们的hashCode值一定要相同;2、如果两个对象的hashCode相同,它们并不一定相同。(例如:String类) 它的意义在于:在集合类中例如Set的要求是,不能有重复的元素出现在集合中。判断不重复的过程:首先比较的是hashcode,若相同再调用此对象的equals()方法做判断。所以,为了提升集合类的性能 ,在重写equels()时有必要重写hashcode(),这样就能在比较hashcode后以很快的速
为什么重写equals方法时,必须重写hashcode方法
1.维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。2.hashcode是用于散列数据的快速存取,如利用hash结构集合类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。所以会出现一种可能,当重写equals方法后,判断对象相等,但其hashcode却不一致,这种相等可以看作为逻辑相等。当使用hash集合类时,存放时会根据该类的hashcod...
为什么要重写equles和hashcode
  经过网上查阅资料得出如下结论                     大家知道,Java中的集合(Collection)有两类,一类是List,再有一类是Set。你知道它们的区别吗?前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?这就是Object.equals方法了。但是,如...
重写equal()和hashcode的原因
重写equal()时为什么也得重写hashCode()之深度解读equal方法与hashCode方法渊源原创 2016年05月08日 23:14:19标签:java equal方法重写 /java /重写equals方法和hashCode方10077转载请注明出处:http://blog.csdn.net/javazejian/article/details/51348320今天这篇文章我们打算来...
为什么equals()与hashCode(),这两个方法需要一起覆盖?
在哈希表中,当我们向其添加对象object时,首先调用hashCode()方法计算object的哈希码,通过哈希码可以直接定位object在哈希表中的位置(一般是哈希码对哈希表大小取余)。如果该位置没有对象,可以直接将object插入该位置;如果该位置有对象(可能有多个,通过链表实现),则调用equals()方法比较这些对象与object是否相等,如果相等,则不需要保存object;如果不相等,则...
建立一个对象模型的时候,为什么要重写hashCode与equals方法
为了阐明其作用,我们先来假设有如下一个Person类。 class Person { public Person(String name, int age) { this.name = name; this.age = age; } private String name; private int age; public
Hibernate中为什么要重写equals()和hashCode()这两个方法
Hibernate中为什么要重写equals()和hashCode()这两个方法
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 为什么要学习产品经理 为什么要学习云计算