黑马程序员技术交流社区
标题:
集合中的hashCode方法自动调用equals方法吗?
[打印本页]
作者:
杜明辉
时间:
2012-1-27 18:15
标题:
集合中的hashCode方法自动调用equals方法吗?
本帖最后由 杜明辉 于 2012-2-2 13:41 编辑
想问大家一个问题,集合中的hashCode方法在算完哈希值后,自动调用equals方法进行判断吗?
如果不是,为什么没看到equals方法的调用?
查了api文档,但没看懂。有高手吗?求解.......
class HashSetTest
{
public static void sop(Object obj)
{
System.out.println(obj);
}
public static void main(String[] args)
{
HashSet hs = new HashSet();
hs.add(new Person("a1",11));
hs.add(new Person("a2",12));
hs.add(new Person("a3",13));
hs.add(new Person("a1",11));
hs.add(new Person("a2",12));
Iterator it = hs.iterator();
while(it.hasNext())
{
Person p = (Person)it.next();
sop(p.getName()+"::"+p.getAge());
}
}
}
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name = name;
this.age = age;
}
public int hashCode()
{
System.out.println(this.name+"....hashCode");
return name.hashCode()+age*37;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;
System.out.println(this.name+"...equals.."+p.name);
return this.name.equals(p.name) && this.age == p.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
作者:
杜明辉
时间:
2012-1-27 18:30
没人顶?没人答? 我晕。。。。。自己顶
作者:
黄秋
时间:
2012-1-27 20:17
集合中的hashCode方法、equals方法是两个作用不同的方法。顾名思义,hashCode是判断hash值是否相等,equals判断元素的值是否相等。既然它们是独立的方法,作用也不同,hashCode方法自然不会自动调用equals方法。都是比较是否相等,有时会混淆。
在判断两个元素是否相同时,会用到其中一个,或两个,这样它们又扯在一起了。由于集合的唯一性,在向集合添加元素时,要判断集合中是否有此元素。先用Hashcode方法得到哈希值,就是元素所在引用的地址值,如两元素的哈希值不等,就直接加入集合;如相等,再用equals来判断这两个对象是否相等,若equals等,就是相同了。
哪为什么要用Hashcode呢?它快速呀,这个可找些资料看看。
作者:
逄焕玮
时间:
2012-1-28 00:07
HashSet是通过hashCode()和equals()这两个方法来确保集合中元素的唯一性的
集合中的hashCode方法在算完哈希值后,自动调用equals方法进行判断吗?
并不是hashCode()方法去调用equals()方法的,而是HashSet在添加,删除以及判断时,这些方法会自动调用hashCode()和equals()的
拿添加元素的方法boolean add(E e) 来说,当调用add()方法时,会先调用hashCode()计算哈希值
如果元素的hashCode()值不同,就不必再去调用equals(),哈希值不同,就直接当成不同的元素存入HashSet了
如果元素的hashCode()值相同,才会调用equals()继续判断是否相同,不同的话,会当成不同的元素存入HashSet,相同的话就是HashSet中已经存在该元素了
boolean contains(Object o) 判断此 set 包含指定元素 以及 boolean remove(Object o) 移除元素 也都需要用这俩方法判断的
如果不是,为什么没看到equals方法的调用?
我拷了你的代码运行了一下,结果中
a1....hashCode
a2....hashCode
a3....hashCode
a1....hashCode
a1...equals..a1
a2....hashCode
a2...equals..a2
a1::11
a3::13
a2::12
有equals()方法被调用的输出说明啊
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2