A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 秦冲 黑马帝   /  2011-10-30 03:00  /  2276 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

当overwrite了一个Object的equals方法,一般还要overwrite另一个方法hashcode(),为什么?

评分

参与人数 1技术分 +1 收起 理由
杨玉揆 + 1

查看全部评分

6 个回复

倒序浏览
这是为了能让你写的类对象能往Set集合里面存储
实现了Set接口的两个类:hashset和treeset
当要往hashset集合里存对象的时候,就要保证存入的对象不能重复,这就要用到对象里的hashcode()和equals()方法,首先判断两个对象的hashcode(),判断两个对象的hash值,如果不相等,就说明两个对象不同,如果相等就还要比较两个对象的equals()方法,比较对象里的内容是否相等,如果equals()再相同,说明集合里已经存在同样的对象
treeset使用的是二叉树结构,当要往treeset集合里存储对象,还要实现comparable接口,让对象具备可比性,因为treeset集合要给对象排序

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

回复 使用道具 举报
因为java的collection很多都需要hashCode(),例如HashTable
比如说你往里面存了一个值,你在取这个值的时候,java实际上通过hashCode()来找那个值,因为这样通常比较快。如果你覆盖了equals()方法,意味着原来不相等的两个对象现在可能变得相等,但hashCode()的值却不相等,这样你使用HashTable就会出现存进去的东西找不到

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

回复 使用道具 举报
一般的地方不需要重載hashCode,衹有當類需要放在HashTable、HashMap、HashSet等等hash結構的集合時才會重載hashCode,就HashMap來說,好比HashMap就是一個大內存塊,裏面有很多小內存塊,小內存塊裏面是一系列的對象,可以利用hashCode來查找小內存塊hashCode%size(小內存塊數量),所以當equal相等時,hashCode必須相等,而且如果是object對象,必須重載hashCode和equal方法

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

回复 使用道具 举报
overwrite了一个Object的equals方法主要是为了实现自己定义的类之间的比较,没有必要overwrite其他什么方法。
比如你自己定义了一个Student类,而两个类的相等只需要ID号相等即可,此时就需要你overwrite equals方法了

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
绿影 黑马帝 2011-10-31 19:09:37
地板
这个问题主要是在集合中,Set集合需要保证元素的唯一性。而判断一个元素是否唯一就涉及到两个元素的唯一判断。每一个种集合的底层数据结构不一样,则判断元素唯一性的方式也就不一样。
hashset底层是哈希表数据结构。哈希表存储元素时,必须使用元素对象的hashcode方法获取该对象的哈希值,来确定该对象在表中的位置,如果hashcode不同他就认为这两个对象肯定是不同的两个对象。就会存入集合。如果hashcode相同,则会继续判断两个元素的equals方法是否为ture。如果为ture,那么认为两个对象一样。将要存储的对象不会存储到集合中。反之则会将hashcode+1顺延存储(hash数据结构的“桶”理论)。
而在treeset集合中则是实现Comparable接口(覆盖CompareTo方法)和Comparator接口(覆盖Compare方法)来让自己对象具有可比较性。保证元素唯一性。
而在ArrayList中仅仅需要重写equlas方法去判断。元素是否相同。但是由于list集合本身的有序性,很少用到。

评分

参与人数 1技术分 +2 收起 理由
宁超 + 2 很给力!

查看全部评分

回复 使用道具 举报
李龙龙 黑马帝 2011-10-31 21:11:42
7#
集合类实现Compareble接口,覆盖compareTo()方法,是让对象自身具有比较性。当本身具备比较性,但是它的比较方式不是所需要时,实现comparator接口覆盖compare()方法,此方法为比较器,是用在集合类的构成函数中。在利用迭代器进行遍历时,需进行类型转换,可以使用泛型,提高代码的复用性。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马