- import java.util.*;
- /*
- 往hashSet集合中存入自定义对象
- 姓名和年龄相同为同一个人,重复元素。
- */
- class HashSetTest
- {
- 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("a3",13));
- hs.add(new Demo());
- //hs.add(new Person("a2",12));
- //hs.add(new Person("a2",12));
- //hs.add(new Person("a2",12));
- Iterator it = hs.iterator();
-
- while(it.hasNext())
- {
- Person p = (Person)it.next();
-
- sop(p.getName()+"..."+p.getAge());
- }
- }
- public static void sop(Object obj)
- {
- System.out.println(obj);
- }
- }
- class Demo
- {
- }
- 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+"...hash");
- //return 60;//哈希地址一样,再调用equals
- return name.hashCode()+age*39;//有的要*39,尽量保证唯一。
-
- }
- public String getName()
- {
- return name;
- }
- public int getAge()
- {
- return age;
- }
- public boolean equals(Object obj)
- {
- if(!(obj instanceof Person))
- return false;
- //先判断是否包含,更严谨的话,这里直接抛异常。我不传person,传DEMO,没意义
- Person p = (Person)(obj);
- System.out.println(this.name+"..."+p.name);//如果此处没有打印,没有调用,
- //因为地址不同,不再比较equals
- return this.name.equals(p.name) && this.age==p.age;
- }
-
- }
复制代码 //先判断是否包含,更严谨的话,这里直接抛异常。我不传person,传DEMO,没意义
程序会报ClassCastException错误,这是因为Demo不属于Person,强转不成功,代码为毕老师视频中的演示例子,毕老师也有提到这个错误,为了这个程序的健壮,我们应该怎么改进?就是不管添加哪种对象,程序都行运行。
是改写instanceof这段吗?
帮帮忙,各位。 |