A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐增友 中级黑马   /  2012-10-7 23:07  /  3335 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.util.ArrayList;
  2. import java.util.HashSet;
  3. import java.util.Iterator;

  4. public class day01 {
  5.         public static void main(String args[]){
  6.                 Person p1=new Person("lisi1",21);
  7.         Person p2=new Person("lisi2",22);
  8.         Person p3=new Person("lisi3",23);
  9.         Person p4=new Person("lisi4",24);
  10.         Person p5=new Person("lisi3",23);
  11.         ArrayList list=new ArrayList();
  12.         list.add(p1);
  13.         list.add(p2);
  14.         list.add(p3);
  15.         list.add(p4);
  16.         list.add(p5);
  17.         
  18.         HashSet hashSet = new HashSet();
  19.         hashSet.addAll(list);
  20.         
  21.         Iterator it2=hashSet.iterator();
  22.         while(it2.hasNext()){
  23.              Object obj=it2.next();
  24.              Person p=(Person)obj;
  25.              System.out.println(p.getName()+"::"+p.getAge());
  26.         }

  27.         }
  28. }
复制代码

  1. public class Person {
  2.         private String name;
  3.         private int age;
  4.   public String getName() {
  5.    return name;
  6.   }
  7.   public void setName(String name) {
  8.    this.name = name;
  9.   }
  10.   public int getAge() {
  11.    return age;
  12.   }
  13.   public void setAge(int age) {
  14.    this.age = age;
  15.   }
  16.   public Person(String name, int age) {
  17.    super();
  18.    this.name = name;
  19.    this.age = age;
  20.   }
  21.   public String toString()
  22.   {
  23.    return this.toString();
  24.   }
  25.   public boolean equals(Object obj){
  26.    if(this==obj){
  27.     return true;
  28.    }
  29.    if(!(obj instanceof Person))throw new ClassCastException("类型转换错误");
  30.    {
  31.     Person p=(Person)obj;
  32.     return this.name.equals(p.name)&&this.age==p.age;
  33.    }
  34.   }}
复制代码
结果:lisi1::21
lisi3::23
lisi3::23
lisi4::24
lisi2::22

怎么没有去掉重复元素啊

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
因为你没有重写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值来在集合所开辟的那段内存单元中查找、定位到存放元素的位置的,若出现这种情况就发生内存泄露,应该特别注意。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这个帖子我说了这个问题 http://bbs.itheima.com/thread-27321-1-2.html
回复 使用道具 举报
谢谢各位
{:soso_e113:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马