黑马程序员技术交流社区
标题:
问题待解救。。。。
[打印本页]
作者:
王飞
时间:
2012-7-21 18:40
标题:
问题待解救。。。。
本帖最后由 王飞 于 2012-7-21 19:57 编辑
import java.util.HashSet;
import java.util.Iterator;
public class aa {
public static void main(String[] args) {
HashSet<Person> hs = new HashSet<Person>();
hs.add(new Person("java01",10));
hs.add(new Person("java02",20));
hs.add(new Person("java03",30));
hs.add(new Person("java02",20));//不会添加进去才对的呀
//帅哥请问:
HashSet不是无序的吗,添加进去的对象不能是相同的对象,
那么为什么我添加了2次"java02",20都添加进去了呢?这是为什么啊
求指教。。。。。。。
Iterator<Person> it = hs.iterator();
while(it.hasNext())
{
Object obj = it.next();
Person p = (Person)obj;
System.out.println(p.getName()+"......"+p.getAge());
}
}
}
class Person{
private String name ;
private int age ;
Person(String name ,int age){
this.name = name;
this.age = age;
}
public boolean equals(Object obj)
----此处我把Object对象改了也不对。。。。这是为什么啊 糊涂中,待解救
{
if(!(obj instanceof Person)) //判断obj是不是Person这个类型的
return false;
Person p = (Person)obj;
return this.name.equals(p.name) && this.age==p.age;
}
public String getName()
{
return this.name;
}
public int getAge()
{
return this.age;
}
}
作者:
王龙彪
时间:
2012-7-21 18:45
HashSet是用hashCode()和equals()来去除重复元素的
你没有重写hashCode()方法
作者:
程潇
时间:
2012-7-21 19:30
本帖最后由 程潇 于 2012-7-21 19:45 编辑
HashSet保证元素唯一性是通过元素的两个方法hashcode和equals来完成的。具体过程如下:
1.先比较元素的hashcode,如果元素的hashcode值相同,会继续判断equals是否为true,如果equals为true,则表示两个元素相同
2.如果比较hashcode时,元素的hashcode值不同,已经判断出两个元素不相同,就不调用equals了。
你的例子中,没有覆写hashcode方法。
hs.add(new Person("java01",10));
hs.add(new Person("java02",20));
hs.add(new Person("java03",30));
hs.add(new Person("java02",20));
以上四条语句创建的Person对象的hashcode值都不相同,所以在比较元素时,认定它们是不相同的,所以第二个"java02"就存进去了。
修改方法:在Person类中覆写hashcode方法如下。
public int hashCode(){
return name.hashCode()+age;
}
作者:
王飞
时间:
2012-7-21 19:35
个么
在此谢了。。。{:soso_e183:}
这么大热天的请大家吃西瓜{:soso_e156:}
辛苦了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2