www.cpsh.net > hAshsEt判断元素自定义为什么还要重写EquAls方法,...

hAshsEt判断元素自定义为什么还要重写EquAls方法,...

如果两个元素的hashcode不相同,那么肯定是不同的元素;如果两个元素的hashcode相同,那么不一定两个是不同的元素.两个不同的元素可能计算出来的hashcode是相同的.hash的作用在于快速检索,而不是单纯地为了判断对象的相等.

理论上要求重写,在hshset里面,你记住下面两条规则就好:1、内容equals的对象hashcode肯定相等 2、两个对象的hashcode不相等则两个对象不equals所以你重写了equals,根据第1点,理论上要重写hashcode,以确保第1点(第2点是第1点的逆反定义,所以隐含了也要保证第2点)的特性.

如果你重载了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样.这样,当你用其中的一个作为键保存到hashMap、hasoTable或hashSet中,再以“相等的”

equals 方法和 hashcode 方法没有必然关系,并不是说重写 equals 方法就一定要重写 hashcode 方法.用途不同, equals 用来比较两个对象是否相等,在大多数 jdk 的集合类中判断唯一性的时候使用的都是 equals 方法.而 hashcode 方法用来计

1、重写equals方法时需要重写hashCode方法,主要是针对Map、Set等集合类型的使用;a: Map、Set等集合类型存放的对象必须是唯一的;b: 集合类判断两个对象是否相等,是先判断equals是否相等,如果equals返回TRUE,还要再判断HashCode返回值是否ture,只有两者都返回ture,才认为该两个对象是相等的.2、由于Object的hashCode返回的是对象的hash值,所以即使equals返回TRUE,集合也可能判定两个对象不等,所以必须重写hashCode方法,以保证当equals返回TRUE时,hashCode也返回Ture,这样才能使得集合中存放的对象唯一.

主要原因是默认从Object继承来的hashCode是基于对象的ID实现的.如果你重载了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样.这样,当你用其中的一

重载了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样.这样,当你用其中的一个作为键保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一

hashCode 的常规协定是:在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改.从某一应用程序的一次执行到同一应用程序的另一次执行,该

因为如果不这样做的话,就会违反object.hashcode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括hashmap、hashset和hashtable. 另外在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对这同一个对象调用多次,hashcode方法都必须始终如一地返回同一个整数.在同一个应用程序的多次执行过程中,每次执行所返回的整数可以不一致. 而且如果两个对象根据equals()方法比较是相等的,那么调用这两个对象中任意一个对象的hashcode方法都必须产生同样的整数结果.

并不能认为当前没有错误就认为可以忽略一些问题,在将对象存入集合中时,有时需要根据equals和hashcode方法判定要存入的两个对象是否一致,如果这两个方法的判定结果不一致,会出现意想不到的错误,即使一个普通对象当前没有必要重写hashcode方法,那从长远的角度看,为了避免今后一些不必要的麻烦,最好还是将equals和hashcode方法一同重写,并保证判定结果一致.这也看做是一项约定或惯例.

网站地图

All rights reserved Powered by www.cpsh.net

copyright ©right 2010-2021。
www.cpsh.net内容来自网络,如有侵犯请联系客服。zhit325@qq.com