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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郝亚平 黑马帝   /  2011-11-23 20:03  /  2486 人查看  /  6 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郝亚平 于 2011-11-24 12:42 编辑

Java中所有的类都集成自Object类,有个hashCode(),还有个equals()。
谁给讲讲这二者之间有什么关系吗?通常是做什么用的?有应用例子最好啊。

6 个回复

倒序浏览
当向HashSet里添加元素时,是先根据Hashcode方法来得到哈希值,就是元素所在引用的地址值,如果这两个元素的哈希值不等时,就直接被加入HashSet里了,如果相等了,这时候再用equals来判断这两个对象是否相等。

一般原则是这样的,我们一定要把我们认为相等的元素排除掉,比如学生类,我们如果认为姓名和年龄相等,就是指同一个学生,所以hashcode()方法可以这样写hashcode(){
   return  name.hashcode()+age;


equals(Object obj)  {
    if (obj istanceof Student){
        Student s=(Student) obj
    }
    if (this.name.equals(s.name)&&this.ag==s.age){
              return true;
    }else{
               return false
         }
}
回复 使用道具 举报
申绪胜 发表于 2011-11-23 20:15
当向HashSet里添加元素时,是先根据Hashcode方法来得到哈希值,就是元素所在引用的地址值,如果这两个元素 ...

谢谢。明白点了。:)
回复 使用道具 举报
强子 黑马帝 2011-11-24 08:37:56
板凳
本帖最后由 强子 于 2011-11-24 08:40 编辑

我笔记中记的:
   用哈希算法来提高从集合中查找元素的效率,这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储在哪个区域。
只有类的实例对象要被采用哈希算法进行存储和检索时,这个类才需要按要求覆盖hashCode方法,即使可能暂时不会用到当前类的hashCode方法,但是为它提供一个hashCode方法也不会有什么不好,没准以后什么时候有用到这个方法了,所以,通常要求hashCode方法和equals方法一并被同事覆盖。
通常来说,一个类的两个实例对象用equals()方法来比较的结果相等时,他们的哈希码也必须相等,但反之则不成立,即equals方法比较结果不想等的对象可以有相同的哈希码。或者说哈希码相同的两个对象的equals方法比较的结果可以不等,例如,字符串“BB”和“Aa”的equals方法比较结果可定不想等,但它们的hasCode方法返回值却相等。
当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这回导致无法从HashSet集合中单独删除当前对象,从而造成内存泄漏。

评分

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

查看全部评分

回复 使用道具 举报
hashCode(),还有个equals()。是用来判断唯一性的,一般他们的底层都是基于哈希表实现的,当哈希表中的数据存储时,会按照一种特定的规则,这种规则叫哈希函数,他会根据传进来的值返回一个位置,这个位置就是这个值最终被存放的位置,
比如 我们知道hashMap在判断函数唯一性的时候,先是通过 hasCode方法计算出这个传进来参数的哈希值,然后看是否和集合中已有的元素有冲突,如果有,那么再调用equals方法,然后在根据这个判断是否唯一,注意这两个方法我们可以复写,即我们可以给他们制定哈希值,规定哈希函数

评分

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

查看全部评分

回复 使用道具 举报
1、如果两个对象相同(equals),那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同(equals)

评分

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

查看全部评分

回复 使用道具 举报
郝亚平 黑马帝 2011-11-24 12:32:53
7#
谢谢你们的回答。很好。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马