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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑庆伟 中级黑马   /  2012-7-8 18:57  /  1639 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郑庆伟 于 2012-7-8 20:13 编辑

import java.util.*;
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("a4",14));
                sop(hs.remove(new Person("a3",13)));

                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 60;//name.hashCode()+age;
        }

        public boolean equals(Object obj)
        {

                if(!(obj instanceof Person))
                        return false;
                Person p = (Person)obj;
                System.out.println(this.name+"..equals.."+p.age);
                return this.name.equals(p.name) && this.age == p.age;
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }

}

点评

楼主看到泛型的内容就明白了。  发表于 2012-7-8 22:31

2 个回复

倒序浏览
本帖最后由 高原 于 2012-7-8 19:18 编辑

是多态,由于你程序里没有使用泛型,往Set集合里存的是东西都被视为Object,那么使用迭代器取出来的时候也是Object类型,
getAge()方法是Person类特有的方法,想要使用此方法,需要先强转,即 Person p = (Person)it.next;
如果使用了泛型,将Set限定为Person,那么就是存入的是Person,取出的也是Person,就可以不需要强转了
  1. import java.util.HashSet;
  2. import java.util.Iterator;


  3. public class HashSetTest
  4. {
  5.         public static void sop(Object obj)
  6.         {
  7.                 System.out.println(obj);
  8.         }
  9.         public static void main(String[] args)
  10.         {
  11.                 HashSet<Person> hs = new HashSet<Person>(); //使用泛型,表示集合中存的都是Person,如果存入的时候不是Person对象,编译时报错
  12.                 hs.add(new Person("a1",11));
  13.                 hs.add(new Person("a2",12));
  14.                 hs.add(new Person("a3",13));
  15.                 hs.add(new Person("a4",14));
  16.                 sop(hs.remove(new Person("a3",13)));

  17.                 Iterator<Person> it = hs.iterator();  //这里也要使用泛型,表示取出的都是Person
  18.                 while(it.hasNext())
  19.                 {
  20.                         Person p = it.next();  //取出时不再需要强转
  21.                         sop(p.getName()+"::"+p.getAge());
  22.                 }

  23.         }
  24. }
  25. class Person
  26. {
  27.         private String name;
  28.         private int age;
  29.         Person(String name, int age)
  30.         {
  31.                 this.name = name;
  32.                 this.age = age;
  33.         }
  34.     public int hashCode()
  35.         {
  36.                 System.out.println(this.name+".....hashCode()");
  37.                 return 60;//name.hashCode()+age;
  38.         }

  39.         public boolean equals(Object obj)
  40.         {
  41.                 if(!(obj instanceof Person))
  42.                         return false;
  43.                 Person p = (Person)obj;
  44.                 System.out.println(this.name+"..equals.."+p.age);
  45.                 return this.name.equals(p.name) && this.age == p.age;
  46.         }
  47.         public String getName()
  48.         {
  49.                 return name;
  50.         }
  51.         public int getAge()
  52.         {
  53.                 return age;
  54.         }

  55. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报
这样,我还没有看到泛型  你说的我能理解,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马