01
import java.util.*;
02
public class Main1
03
{
04
public static void main(String args[])
05
{
06
HashSet hs=new HashSet();
07
hs.add(new Person("张三",11));
08
hs.add(new Person("张三",12));
09
hs.add(new Person("李四",13));
10
hs.add(new Person("王五",14));
11
hs.add(new Person("张三",11));
12
show(hs);
13
}
14
public static void show(HashSet hs)
15
{
16
Iterator it=hs.iterator();
17
System.out.println("\n\n\n");
18
System.out.println("验证输出:");
19
while(it.hasNext())
20
{
21
Person p=(Person)it.next();
22
System.out.println(p.getName()+":"+p.getAge());
23
}
24
}
25
}
26
public class Person
27
{
28
private String name;
29
private int age;
30
public Person(String name,int age)
31
{
32
this.name=name;
33
this.age=age;
34
}
35
public Person(){}
36
public String getName()
37
{
38
return name;
39
}
40
public int getAge()
41
{
42
return age;
43
}
44
}
关于这段代码,输出结果是:
验证输出:
张三:12
王五:14
张三:11
张三:11
李四:13
我的疑惑是为什么HashSet容器会插入成功两个相同的对象?HashSet在添加对象的时候会计算它们的hashCode(),然后找到这个地址,看看对象是否已经存在,如果存在的话就表明冲突了,如果冲突了就先调用equals()方法比较两个对象是否相同,如果相同的话就不添加这个对象,如果不相同的话,就采用解决冲突的办法将冲突的对象添加到容器中。这个原理大概大多数人都知道,但是我不理解为什么上面的例子会插入成功?是equals()方法上出了问题吗?equals()方法应该是继承了object类的方法吧?如果是这样的话比较的应该是对象的内容而非地址吧?很明显,两次创建的对象是相同的,于是问题就出来了:为什么会添加成功第二个 张三 11呢? |
|