黑马程序员技术交流社区

标题: == 、equals、hashCode问题 [打印本页]

作者: 付星    时间: 2011-12-29 16:24
标题: == 、equals、hashCode问题
本帖最后由 付星 于 2012-1-1 17:00 编辑

在HashSet类中,对于add方法,加入一个数据时,==、equals、hashCode是怎么比较的?
作者: 韩金蕊    时间: 2011-12-29 16:27
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。

所以最后插入失败。


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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2