在根类Object中,实现了equals()和hashCode()这两个方法 equals()是对两个对象的地址值进行的比较(即比较引用是否相同),用==实现。 hashCode():计算出对象实例的哈希码。根类Object的hashCode()方法的计算依赖于对象实例的内存地址,即内存地址由哈希函数生成一个int值,故每个Object对象的hashCode都是唯一的;当然,当对象所对应的类重写了hashCode()方法时,结果就截然不同了。之所以有hashCode方法,是因为在批量的对象比较中,hashCode要比equals来得快,很多集合都用到了hashCode,比如Hashtable。
在集合中,判断两个对象是否相等的规则是: 第一步,如果hashCode()相等,则查看第二步,否则不相等; 第二步,查看equals()是否相等,如果相等,则两obj相等,否则还是不相等。
比如set集合存储数据的时候是怎样判断存进的数据是否已经存在。使用equals()方法呢,还是hashCode()方法。假如用equals(),那么存储一个元素就要跟已存在的所有元素比较一遍,比如已存入100个元素,那么存101个元素的时候,就要调用equals方法100次。 但如果用hashcode()方法的话,每存一个数据就调用一次hashCode()方法,得到一个hashCode值及存入的位置。如果该位置不存在数据那么就直接存入,否则调用一次equals()方法,不相同则存,相同不存。这样下来整个存储下来不需要调用几次equals方法,虽然多了一次hashCode方法,但相对于前面来讲效率高了不少。
因为Object的equals()方法默认是两个对象的引用的比较,意思就是指向同一内存则相等,否则不相等;如果你现在需要利用对象里面的值来判断是否相等,则重载equals()方法。记住:String,Double、Integer、Math这些类已经重写了equals()方法,比较的是对象的值。
如果不这样做到话,就会违反Object.hashCode的通用约定:相等的对象必须具有相等的散列码hashCode。根据一个类的equals方法,两个截然不同的实例有可能在逻辑上是相等的,但是,根据Object类的hashCode方法,它们仅仅是两个对象,对象hashCode方法返回两个看起来是随机的整数,而不是根据第二个约定要求的那样,返回两个相等的整数。从而导致该类无法与所有基于散列值(hash)的集合类结合在一起正常运作,这样的集合类包括hashMap、HashSet和Hashtable。比如new一个对象,再new一个内容相等的对象,调用equals方法返回的true,但他们的hashCode值不同,将两个对象存入HashSet中,hashCode值不同,都可以存进去,这样set中包含两个相等的对象。因为是先检索hashCode值,相等的情况下才会去比较equals方法。
Hash表数据结构常识: 一、哈希表基于数组。 二、缺点:基于数组的,数组创建后难以扩展。某些哈希表被基本填满时,性能下降得非常严重。 三、没有一种简便的方法可以以任何一种顺序遍历表中数据项。 四、如果不需要有序遍历数据,并且可以提前预测数据量的大小,那么哈希表在速度和易用性方面是无与伦比的。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。