黑马程序员技术交流社区
标题:
关于 set 去重问题
[打印本页]
作者:
唐增友
时间:
2012-10-7 23:07
标题:
关于 set 去重问题
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
public class day01 {
public static void main(String args[]){
Person p1=new Person("lisi1",21);
Person p2=new Person("lisi2",22);
Person p3=new Person("lisi3",23);
Person p4=new Person("lisi4",24);
Person p5=new Person("lisi3",23);
ArrayList list=new ArrayList();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
HashSet hashSet = new HashSet();
hashSet.addAll(list);
Iterator it2=hashSet.iterator();
while(it2.hasNext()){
Object obj=it2.next();
Person p=(Person)obj;
System.out.println(p.getName()+"::"+p.getAge());
}
}
}
复制代码
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String toString()
{
return this.toString();
}
public boolean equals(Object obj){
if(this==obj){
return true;
}
if(!(obj instanceof Person))throw new ClassCastException("类型转换错误");
{
Person p=(Person)obj;
return this.name.equals(p.name)&&this.age==p.age;
}
}}
复制代码
结果:lisi1::21
lisi3::23
lisi3::23
lisi4::24
lisi2::22
怎么没有去掉重复元素啊
作者:
谭立文
时间:
2012-10-7 23:13
因为你没有重写hashCode方法
HashSet集合的主要特点是:不保证顺序(若用LinkedHashSet可以做到按添加时的顺序),因为底层是用Map来实现,唯一性:1.hashCode、equals
元素被添加到 HashSet集合的过程:
首先被添加对象调用该对象的hashCode方法获得hashCode,根据该hashCode寻找HashSet集合所在的内存单元,若两个不同的对象具有相同的hashCode则会调用
equals方法进一步进行比较,具体的比较方式可以自己去实现,默认的比较的是两个对象的引用,若引用相同则不会被添加到集合中,一般我们会自己重写hashCode方法和equlas方法来避免重复添加的问题,因为hashCode的默认计算方式是根据对象的内存地址信息来计算出的,是一个native方法。
若没有hash冲突则该对象就直接被添加到集合当中了,不会再调用equlas。
值得注意的是若某个类依据其某个或某些Filed重写了hashCode方法,在该对象被添加到集合中之后,若修改了该对象参与计算hashCode值得字段,则该对象将不能够再通过
集合的public boolean remove(Object o)方法从集合当中移除了,因为HashSet集合(这种数据结构)就是依靠计算元素的hashCode值来在集合所开辟的那段内存单元中查找、定位到存放元素的位置的,若出现这种情况就发生内存泄露,应该特别注意。
作者:
黄小贝
时间:
2012-10-7 23:15
这个帖子我说了这个问题
http://bbs.itheima.com/thread-27321-1-2.html
作者:
唐增友
时间:
2012-10-7 23:25
谢谢各位
{:soso_e113:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2