equals()方法和hashCode()方法

说重写equals必须跟着重写hashCode,即如果x.equals(y)返回true,那么x.hashCode()也要等于y.hashCode()。

假设比较员工的name,很好理解,当name相同的时候,hashCode也相同,因为String有自己的hashCode计算方法,是按照内容返回的。
但是如成员变量属于某个其他的类,而这个类没有自己的hashCode方法,那么只能返回Object的默认hashCode计算结果,即对象的存储地址。
此时x.equals(y)可以为true,(假设x和y是Date类的对象,表示入职时间)。但存储地址肯定不一样啊。这怎么说?

2个回答

java中的数据类型,可分为两类:
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
他们之间的比较,应用双等号(==),比较的是他们的值。
2.复合数据类型(类)
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。

如果两个对象根据equals()方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果。
如果两个对象根据equals()方法比较是不相等的,那么调用这两个对象中任意一个对象的hashCode方法,则不一定要产生相同的整数结果

whyyouhitme_
whyyouhitme_ 啊,如果按默认情况,equals方法和hashCode本质比较的东西是一样的。hashCode之所以不按地址返回了,必然是equals先被重写了。我给先决条件搞反了
一年多之前 回复

equals判断相等,hashcode必须相等
equals不等,hashcode可以相等,可以不相等。

之所以区分equals和hashcode,前者为了精确比较,后者为了快速比较(如果hash不相等,没有必要进一步比较了,肯定不等);同时利用hash,给对象的列表编排索引。

考虑两个满足以上规则的极端的情况:
(1)equals只要不相等,hashcode一定不相等。为了达成这一点,计算hashcode的时间成本和完整比较两个对象的时间成本一致。
(2)无论怎么样的两个对象,hashcode都返回一个常数。这么做符合规则,但是会使得hasttable的搜索速度趋近于线性搜索。

所以,在满足规则的前提下,hashcode的算法应该避免以上两个极端,至于具体用什么算法,这个倒不一定。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
hashCode方法和equals方法
hashCode方法怎么比较对象,equals方法怎么比较对象
equals方法和hashcode方法
比较两个对象是否相等,只能用equals,因为不同对象可能会有相同的hashcode值。但是如果要判断两个对象是否不等,就可以用hashcode方法,因为不同的对象的hashcode值肯定不相等。话句话说: 如果两个对象通过equals比较之后,返回的是true,那么这两个对象的hashcode值必定相等; 如果equals返回的是false,那么这两个对象的hashcode值不一定不相等;
equals()方法和hashcode()方法!
为什么要重写equals和hashcode? 记住: Object类中的equals方法默认比较的是对象的地址,因为只有是相同的地址才会相等(x == y),如果没有重写equals方法,那么默认就是比较的是地址。 而无论何时如果equals方法被重写那么都是有必要去重写hashCode方法,这个是因为为了维持hashCode的一般约定(general contract),相同的对象必须要有相同的...
equals方法与hashcode方法
* 作为HashMap的key的元素equals方法与hashcode方法返回的结果直接影响着散列表的查询性能  * 当两个key的hashcode值一样,意味着他们在散列桶(HashMap中维护的数组)的相同位置,但若这两个key的  * equals比较结果不为true,则在HashMap中就会形成链表,这样的情况多了HashMap的查询性能会降低很多。  * 所以应当妥善处理作为Key
hashCode方法与equals方法
1,分析为什么要重写hashCode方法和equals方法: //学生类 class Student{ String id; //这里为了方便说明hashCode的重写,定义一个全局变量和构造方法 public Student(String id) { } } //test类 public class Test { public static void main(String[] a...
equals方法和hashCode方法
equals方法和hashCode方法 创建User类,重写它的equals方法和hashCode方法。 public class User { private Integer userId; private String account; private String key; private Character sex; private Intege...
hashCode方法及equals方法的规范
本文系转载,原文地址:hashCode方法及equals方法的规范 在Java中,hashCode方法和equals方法都是java.lang.Object类的方法,在 The Java Language Specification, Java SE 8 Edition 中定义如下: The method equals defines a notion of object equalit...
重写hashCode()方法和equals()方法
1、Object类中有hashCode()和equals方法 public native int hashCode(); //根据地址进行运算得到的伪随机数 public boolean equals(Object obj) {//直接判断内存地址 return (this == obj); } A == B: 同一个内存地址。 A.equals(B) :AB对象内容相同...
equals方法和hashcode方法的区别
最近在准备面试的时候,了解到这一块,然后今晚上就查找资料,然后自己实际写代码,理解了其中的真实区别,在此记录下来,方便自己以后的复习,一个宗旨,学习不仅仅是为了面试,而是提升自己的一个漫长过程。废话不多说,就把自己觉得重点的理解写下来。equals方法和hashcode方法都是object类中的一个方法,每个object类中都会有equals方法,在没有被重写的情况下,equals方法和“==”的...
equals方法与和hashcode方法的关系
equals方法与和hashcode方法都来自所有类的超类Object类,所以所有的类都会直接或间接的去继承这两个方法,足以看出来这两个方法多么重要。原始equals方法的作用?去判断两个对象是否指向同一个地址,是否为同一个引用。当然也有很多类,例如Sting类根据自己的需要这个方法,去比较两个对象的值是否相等。原始hashcode方法的作用?会为创建的对象分配一个独有的值,这里应该用到的是哈希函...
equals()方法、hashCode()方法的区别
equals()方法、hashCode()方法的区别在ImportNew上看到一篇文章8张图理解Java,下面详细地讲一下hashCode()方法: 如果两个对象相等(equal),那么他们一定有相同的哈希值。 如果两个对象的哈希值相同,但他们未必相等(equal)。 ImportNew原文的示例: Java equals() and hashCode() Contractimport java.
重写equals()方法和hashCode()方法
平时工作中难免会遇到需要根据自己的情况比较自定义对象的时候,这个时候我们就需要重写类的equals方法和hashCode方法。 核心示例代码: class Person{ private String name; private Integer sex; private Integer age; private String idCard; @Ove...
JAVA的equals方法和hashCode方法
equals比较方法因为==只能基本数据类型之间的比较,是比较内存地址。equals方法可以对象和对象之间的属性进行比较。拿String类说,字符串对象是char数组组成的。它有两种赋值方式String a=“abcd”;这种赋值会经过字符串池进行优化。相同字符串内存地址相同。可以用==来比较。String b=new String(“abcd”);这种赋值方式的内存显然是另起内存在存储的,所以就...
细说equals()方法和hashCode()方法
一、前言 对于这两个方法的研究,源于一道比较经典的面试题:“x.equals(y)==true;x,y可有不同的hashcode对吗?”,其实这道题的关键在于考我们对equals()方法和hashCode()方法的理解,网上看了不少文章,有说对的,也有说不对的。在我看来对也不对,具体原因,我们下面慢慢分析。 二、equals()方法 equals()方法是Object中定义...
equals()方法与hashCode()方法详解
前言Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码。equals()和hashCode()都不是final方法,都可以被重写(overwrite);一、equals()方法Object类中equals()方法实现如下:public boolean equals(Object obj) { return...
重写equals()方法和 hashCode()方法
java中判断两个对象是否相等的规则:首先,判断两个对象的hashCode是否相等 如果不相等,认为两个对象也不相等 如果相等,则判断两个对象用equals运算是否相等 如果不相等,认为两个对象也不相等 如果相等,认为两个对象相等 我们在equals方法中需要向下转型,效率很低,所以先判断hashCode方法可以提高效率。equals()相等的两个对象,hashcode()一定相等; equals...
Hashcode()、equals()方法
什么是hashcode:hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值  Object中的:hashcode()、equals() 1.hashcode():判断对象的hashcode是否相等。 2.equals():判断两个对象是否是同一个对象。 3.重写equals():比较的是对象的值是否相等。 4.重写hashcode()
关于hashcode和equals方法
package com.java.equals; import java.util.HashMap; /** * 关于HashCode和Equals * @author yfding * */ public class EqualsTest { public static void main(String[] args) { /** * 概念 ...
equals和hashCode方法分析
1.HashSet存放的是无序,不能重复的对象,当添加一个对象的时,它会先检查此对象的 hashCode值是否与集合中对象的hashCode值相等,如果不等,直接将对象加进去,如果相等,则再用equals方法判断,如果返回的是true表示集合中已经存在此对象,不再进行添加,若返回false将对象添加进去 2.简单来说,如果两个对象equals返回true则它们的hashCode值一定相等,...
equals与hashCode方法详解
一、在讲解之前,我们先来看看Java jdk源码里边的一些关于equals方法: 1.这是Java基类Object里边的equals和hashCode方法,特殊的是这里比较的是两个对象是否相等;public native int hashCode(); public boolean equals(Object obj) { return (this == obj); }2.
hashCode和equals方法辨析
首先理解HashSet里面的元素定位过程: 1.首先调用元素的hashCode()方法来得到元素的哈希值,用来确定当前元素在哪个bucket里面(可以推出如果两个元素的hashCode不一样,则bucket不一样,则肯定不相等)。 2.每个bucket是一个链表,用来存放所有具有相同hashcode的元素。接下来调用当前元素的equals()方法,在当前元素的hashcode对应的bucket
hashCode()与equals()方法的理解
Object的hashCode()与equals()方法的理解
equals和hashCode方法详解
equals和hashCode方法详解在Java.lang.Object类中有两个非常重要的方法:public boolean equals(Object obj) public int hashCode() Object类是类继承结构的基础,所以是每一个类的父类,所有的对象,包括数组,都实现了Object类中定义的方法。1.equals方法详解equals方法是用来判断其他的对象是否和该对象相等。
hashcode和equals方法
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
hashCode和equals方法的重写
我们都知道,在JAVA世界中,万物皆对象。而equals和hashCode这两个方法也在Object类里被定义,先来看这两个方法在Object里面是如何实现的: 先看equals方法: public boolean equals(Object obj) { return (this == obj); } equals方法实现很简单,就是将某对象拿来和原始对象进行...
equals与hashCode方法讲解
这里是一个文档,里边讲解了hashCode与equals方法使用,大家要是不明白,可以去看看
集合之equals与hashCode方法
集合之equals与hashCode方法   一  equals equals方法是Object级的,默认对比两个对象的内存地址,很多类都重写了该方法,对比对象的实际内容,一般对比同一类对象相同属性的属性值是否相同。 二 hashCode 1.哈希表 哈希表是一个数组,数组中的每一个元素都是一个单向链表,同一单向链表中的节点具有相同的属性,属性值是数组的下标,这个相同的
关于equals和hashcode方法
一:生成equals的约定。在《Effective Java》中说明了覆盖equals方法时的一些规则(约定),下面是约定的内容,来自Object的规范【JavaSE6】: equals方法实现了等价关系 1) 自反性:对于任何非null的引用值x,x.equals(x)一定返回true。 2) 对称性:对于任何非null的引用值x,y,当且y.equals(x)返回true时,x.equal
hashCode 与 equals 方法的重写
在重写equals方法的同时,必须重写hashCode方法,equals 方法对比的相同的字段也可根据业务要求做出调整 [参考](https://www.cnblogs.com/dolphin0520/p/3681042.html) 要点: 1.重写 hashCode 与 equals 方法 2.内部类 package com; import java.util.Objects; ...
hashcode()与equals()方法的重写
equals()是超类Object的一个基本方法。 public boolean equals(Object obj) { return (this == obj); } 当类有自己的“逻辑相等”的概念,而且超类还没有覆盖equals来实现期望的行为。 默认情况下也就是从超类Object继承而来的equals方法与‘==’是完全等价的,比较的都是对象的内存地址,但我们可以重...
重写hashCode、equals 方法
/** * 实体类 <Test> * 1.实现了 Serializable 接口 * 2.重写了 hashCode、equals 方法 * @author Spring */ public class Testimplements Serializable { private String id; @Override public int hashCode()...
hibernate 中的equals()和hashCode()方法
HashSet判断加入的对象是否重复的原理: 对于Set接口的实现类HashSet,它是按照哈希算法来存取集合中的对象,并且因为其继承了Set接口,所以不允许插入相同的数据。那么它如何来保证不插入相同的数据,这就要使用到equals()和hashCode()方法了。在我们往HashSet里面添加对象(add()方法里的参数都是对象)的时候,在Add()的方法内部,它首先调用该对象的hashCode...
重写hashcode和equals方法的原则
[code="java"]public class Element { String s; int number; public Element(int n) { number=n; } public int hashCode(){ return s.hashCode()*number; /* int r...
正确重写equals()和hashCode()方法
比较两个Java对象时, 如果相同的对象有不同的hashCode,比较操作会出现意想不到的结果,为了避免这种问题,要同时复写equals方法和hashCode方法,而不要只写其中一个。class People { String name; int age; public People(String name, int age) { this.age = age;
String源码分析之equals和hashcode方法
1.说明== :如果是非引用类型,则值相等;引用类型,则地址相同,也就是指向堆中相同的对象 equals:Object对象而言或者没有重写equals方法的类,等效于==;重写了equals方法则按子类的方法来比较2.String的equals方法2.1 先看代码 public boolean equals(Object anObject) { if (this == anObje
重写hashCode和equals方法案例
当我们建立一个购物车类,里面包含了一个hashMap的时候,我们往这个hashMap中放入一个相同的Product对象,如果不重写,新加入的不会和原有的合并,而是以一个新的键值对插入。所以当hashMap中的key是自定义的类时,我们就需要在自定义类中重写hashCode和equals方法。这样hashMap才能判断两个相同的自定义类是相同的: 购物车类:public class Car
HashCode和equals方法深度分析
           在往HashSet集合中放数据的时候,由于HashSet底层是用HashMap中的Key属性存储的,所以是不能重复的,那他如何判断其不是重复的元素呢.这个时候他判断有两步.        1.调用元素的hashcode 方法,判断两对象的hashCode 是否相等,如果不相等,则认为两对象不相等,结束.如果相等,则转入equals 方法进行判断.   ...
重写equals()和hashcode()方法详解
本文将通过一个示例程序来深入讲解java的equals()方法 1、示例程序: 1 package cn.galc.test; 2 3 public class TestEquals { 4 public static void main(String[] args) { 5 /** 6 * 这里使用构造方法Cat()在堆内存里面new出了...
重写equals()方法就必须重写hashCode()方法
       最近看了Object类的源码,对hashCode() 和equals()方法有了更深的认识。重写equals()方法就必须重写hashCode()方法的原因,需要从源头Object类讲起。 public native int hashCode(); public boolean equals(Object ...
学习hashSet中的equals方法和hashCode方法
学习hashSet中的equals方法和hashCode方法 hashSet中存放的对象不重复,有自动去重功能,实际上就是调用了对象的equals方法,如果存在重复就去掉。 hash表存放和删除数据速度很快,就是用hash函数将每个对象添加一个索引,便于查找。 package listTest; import java.util.HashSet; import java.util.Set...
相关热词 c#部署端口监听项目、 c#接口中的属性使用方法 c# 昨天 c#func链接匿名方法 c#怎么创建文件夹 c#从键盘接收空格 c#da/ad c#部门请假管理系统 c#服务器socket c# 默认的访问修饰符