hashcode()和equals()区别

奔跑在梦想的道路上 奔跑在梦想的道路上     2022-10-27     273

关键词:

  这两个方法均是超类Object自带的成员方法。Object类是所有Java类的祖先。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。在不明确给出超类的情况下,Java会自动把Object作为要定义类的超类。可以使用类型为Object的变量指向任意类型的对象。Object类有一个默认构造方法pubilc Object(),在构造子类实例时,都会先调用这个默认构造方法。Object类的变量只能用作各种值的通用持有者。要对他们进行任何专门的操作,都需要知道它们的原始类型并进行类型转换。例如:

  Object obj = new MyObject();
  MyObject x = (MyObject)obj;
  

  Java语言规范要求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。  

  equals()是对两个对象的地址值进行的比较(即比较引用是否相同)。

  hashCode()是一个本地方法,它的实现是根据本地机器相关的。  

  JVM每new一个Object,它都会将这个Object丢到一个Hash哈希表中去,这样的话,下次做Object的比较或者取这个对象的时候,它会根据对象的hashcode再从Hash表中取这个对象。这样做的目的是提高取对象的效率。具体过程是这样:

  1. new Object(),JVM根据这个对象的Hashcode值,放入到对应的Hash表对应的Key上,如果不同的对象产生了相同的hash值,也就是发生了Hash key相同导致冲突的情况,那么就在这个Hash key的地方产生一个链表,将所有产生相同hashcode的对象放到这个单链表上去,串在一起。

  2. 比较两个对象的时候,首先根据他们的hashcode去hash表中找他的对象,当两个对象的hashcode相同,那么就是说他们这两个对象放在Hash表中的同一个key上,那么他们一定在这个key上的链表上。那么此时就只能根据Object的equal方法来比较这个对象是否equal。当两个对象的hashcode不同的话,肯定他们不能equals.

  list是可以重复的,set是不可以重复的。那么set存储数据的时候是怎样判断存进的数据是否已经存在。使用equals()方法呢,还是hashcode()方法。

  假如用equals(),那么存储一个元素就要跟已存在的所有元素比较一遍,比如已存入100个元素,那么存101个元素的时候,就要调用equals方法100次。

  但如果用hashcode()方法的话,他就利用了hash算法来存储数据的。

  这样的话每存一个数据就调用一次hashcode()方法,得到一个hashcode值及存入的位置。如果该位置不存在数据那么就直接存入,否则调用一次equals()方法,不相同则存,相同不存。这样下来整个存储下来不需要调用几次equals方法,虽然多了几次hashcode方法,但相对于前面来讲效率高了不少。

  因为Object的equal方法默认是两个对象的引用的比较,意思就是指向同一内存,地址则相等,否则不相等;如果你现在需要利用对象里面的值来判断是否相等,则重载equal方法。

  JDK中,String、Math等封装类都对Object中的equals()方法进行了重写。

  java.lnag.Object中对hashCode的约定:

  1. 在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,则对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。
  2. 如果两个对象根据equals(Object o)方法是相等的,则调用这两个对象中任一对象的hashCode方法必须产生相同的整数结果。
  3. 如果两个对象根据equals(Object o)方法是不相等的,则调用这两个对象中任一个对象的hashCode方法,不要求产生不同的整数结果。但如果能不同,则可能提高散列表的性能。

  Java中的Collection有两类,一类是List,一类是Set。List内的元素是有序的,元素可以重复。Set元素无序,但元素不可重复。要想保证元素不重复,两个元素是否重复应该依据什么来判断呢?用Object.equals方法。但若每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。也就是说若集合中已有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。于是Java采用了哈希表的原理。

  当Set接收一个元素时根据该对象的内存地址算出hashCode,看它属于哪一个区间,再这个区间里调用equeals方法。当两个对象的hashCode值相同的时候,Hashset会将对象保存在同一个位置,但是他们equals返回false,所以实际上这个位置采用链式结构来保存多个对象。

hashcode()&equals()的联系和区别

一、hashcode()&equals()的联系与区别  equals():反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值。  hashCode():计算出对象实例的哈希码,并返回哈希码,又称为散列函数。... 查看详情

hashcode和equals区别

hashcode:对象的初始地址的整数表示   Java中的对象是JVM在管理,JVM会在她认为合适的时候对对象进行移动,比如,在某些需要整理内存碎片的GC算法下发生的GC。此时,对象的地址会变动,但hashcode不会改变。    ... 查看详情

hashcode和equals方法的区别与联系

equals:比较的是两个对象的内存地址值hashCode:比较的是两个对象在hash表中的位置hashCode的由来:对象的内存地址通过hash函数算法得到hashcode     1.equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()... 查看详情

hashcode与equals的作用区别和联系

简介:hashCode与equals这一对看似作用相同但细品却有着很大的区别,都是值比较而你我却有着不同的衡量标准。不如我们一起约定一个规则,来更好的为程序服务吧有这么两个结论:1、equals相等的两个对象他们的hashCode肯定相等... 查看详情

一文搞懂==equals和hashcode

...)的区别是什么?以及我们也知道重写equals()时候必须重新hashCode()。这是为什么?既然有了hashCode()方法了,JDK又为什么要提供equals()方法呢?如果在重写equals()时候没有重写hashCode(),在使用HashMap或HashSet的时候可能会出现什么情况... 查看详情

hashcode()和equals()的作用区别联系

hashCode()和equals()方法的作用其实一样,都是用来对比两个对象是否相等,都需要自己去覆写来提高对比效率和准确度,在向hashSet,hashMap等底层用hash值判断的集合中存值时,被存储的对象都需要覆写这两个方法.hashCode()方法返回一个哈... 查看详情

javaequal和hashcode使用

 一、hashCode()和equals()是什么?  hashCode()方法和equals()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致。二、hashCode()和equals()的区别下边从两个角度介绍了他们的区别:一个是性能,一个是可靠性。他们... 查看详情

hashcode()和equals()区别

  这两个方法均是超类Object自带的成员方法。Object类是所有Java类的祖先。每个类都使用Object作为超类。所有对象(包括数组)都实现这个类的方法。在不明确给出超类的情况下,Java会自动把Object作为要定义类的超类。可以使... 查看详情

java中hashcode和equals方法是什么?它们和==各有什么区别?

在Java中,hashCode和equals方法都是Object类的方法。它们的作用分别如下:hashCode方法返回对象的哈希码,用于支持基于哈希表的集合,如HashMap、HashSet等。如果两个对象的equals方法返回true,则它们的hashCode方法必须返回相同的值,... 查看详情

hashcode()和equals()

区别、联系publicinthashCode():返回一个对象的哈希码值publicbooleanequals(Objectobj):判断两个对象是否相等,即是否指向同一内存地址;重写之后则比较的是两个对象的内容是否相等如果两个对象互相equals(),则hashCode()也必须相等hashC... 查看详情

java==equals和hashcode的区别和联系

基础类型4种整数类型:int、long、byte、short2种浮点数类型:float、double1种字符类型:char1种布尔类型:boolean引用数据类型类接口数组1.==1.对于基本类型来说==比较的是值是否相等例如:inta=1;intb=1;System.out.println(a==b);truedoublea=1;doubl... 查看详情

equals和hashcode深入理解以及hash算法原理

equals()和HashCode()深入理解以及Hash算法原理1.深入理解equals():在我的一篇博客“==”和.equals()的区别中向读者提出提醒:Object类中的equals方法和“==”是一样的,没有区别,即俩个对象的比较是比较他们的栈内存中存储的内存地址... 查看详情

java中==和equals和hashcode的区别

1)==若是基本数据类型比较,是比较值,若是引用类型,则比较的是他们在内存中的存放地址。对象是存放在堆中,栈中存放的对象的引用,所以==是对栈中的值进行比较,若返回true代表变... 查看详情

java中equals,hashcode和==的区别(转)

1、==java中的数据类型,可分为两类:1.基本数据类型,也称原始数据类型byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值。 2.引用类型(类、接口、数组)  当他们用(==)进... 查看详情

java==equals()和hashcode()的区别(代码片段)

==1.用==进行比较的时候,比较的是变量的值。变量有两种类型:基本类型(int、double等)引用类型(类、数组等)2.对于基本类型,比较的是字面量inta=12;intb=12;System.out.println(a==b... 查看详情

hashcode()与equals()之间的关系(代码片段)

hashCode()与equals()之间的关系一、介绍?简单介绍与一下hashCode()与equals()1.equals()equals()方法用于比较两个对象是否相等,它与==相等比较符有着本质的不同。区别参考:==和equals的区别2.hashCode()w3c说明:  hashCode()方法用于返回字符... 查看详情

java面试题:hashcode()和equals()(代码片段)

...分equals()的作用第2部分equals()与==的区别是什么?第3部分hashCode()的作用第4部分hashCode()和equals()的关系第1部分equals()的作用equals()的作用是用来判断两个对象是否相等。equals()定义在JDK的Object.java中。通过判断两个对象的地址是否... 查看详情

hashcode与equals的区别与联系

...equals方法用于比较对象的内容是否相等(覆盖以后)2、hashcode方法只有在集合中用到3、当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等)。4、将对象放入到集合中时,首先... 查看详情