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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 付星 黑马帝   /  2011-12-29 16:24  /  1955 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 付星 于 2012-1-1 17:00 编辑

在HashSet类中,对于add方法,加入一个数据时,==、equals、hashCode是怎么比较的?

3 个回复

倒序浏览
1)对于一个程序的一次执行过程中,同一个对象的hashCode计算的结果一定相同,但是对于同一个程序的不同执行过程中,不要求其hashCode一定相同。

2)对于两个对象,如果使用equals方法比较,结果为true,那么这两个对象的hashCode值一定相同

3)对于两个对象,如果使用equals方法比较,结果为false,那么这两个对象的hashCode值不要求一定不同(但是如果不同可以提高程序性能)
当我们向HashSet中add对象,它首先调用它的HashCode方法,得到这个HashCode的返回整数值,这个整数值就会映射到set里面的某一个位置。如果这个对象里没有对象存在,就把这个对象直接放发哦set里面;如果这个位置已经有对象存在了,这个时候就用equals方法比较这两个方法,如果比较结果相同,就不进行插入。比如下面问题



Set set = new HashSet();

set.add("zhangsan");

set.add("lisi");

set.add("wangwu");

set.add("zhangsan");

这个最后一个set.add("zhangsan");是无法插入成功的,因为String重写了Object的equlas和HashCode方法,按照String的HashCode方法,相同的字符串的HashCode一定是一样的

下面详细分析最后一个set.add("zhangsan")具体插入过程

1.首先根据"zhangsan"调用HashCode方法,获得一个返回值

2.Set根据这个返回值获得一个位置

3.查找这个位置上是否有对象,结果发现有一个对象。值也是“zhangsan”

4.对两个对象调用equals方法,由于String重写了equals方法,这个方法返回true。

所以最后插入失败。

评分

参与人数 1技术分 +2 收起 理由
吴上储 + 2 赞一个!

查看全部评分

回复 使用道具 举报
刘旭 黑马帝 2011-12-29 16:54:02
藤椅
第一次加入元素时,不比较。以后加入元素时,先将此元素的hash值与集合中的每个元素的hash值比较,如果不同,再用equals方法和每个元素比较,如果还是不同,则添加成功,否则,添加失败。如果和hash值比较相同,则认为两个元素相同,不会再比较equals方法。
回复 使用道具 举报
hashSet集合在添加元素的时候首先比较hashCode,如果hashCode相等在调用equals方法,哈希值是按照哈希算法得到的一个值,可以理解为对象分配 内存空间首地址,不同对象的哈希值都不一样,hashSet结构里存储的是不同的对象,所以说一般情况下,只要定义一个对象都能存储到hashSet集合中(常数,字符,字符串除外)。实际的使用中我们认为相同的对象,在计算机看来也是不同的,因为对象分配的空间都是不一样的,hashCode也是不一样的。这个时候就需要在hashCode中增加人为因素,复写hashCode方法。hashCode值系统相同后,还不一定是相同的对对象,这个时候还要调用equals方法。只有hashCode一样,equals返回true时,计算机才认为是相同的对象,所以在使用hashSet集合存储对象的时候,这个对象一般都要复写hashCode和equals方法,在这JDK手册中也有特别说明。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马