接着上面的思路:
3 重写Person类中的hashCode方法
运行程序,观察结果。
发现仍然有重复的元素,这是为什么呢?
这是因为在判断元素的哈希值之后,
如果哈希值相同,会调用equals方法判断内容是否一样。
这就要求:
4 重写equals方法.
- import java.util.*;
- //1 把数据存入Person,建立Person类
- class Person
- {
- private String name;//姓名
- private int age;//年龄
- Person(String name,int age)
- {
- this.name = name;
- this.age = age;
- }
- public void setName(String name)
- {
- this.name = name;
- }
- public String getName()
- {
- return name;
- }
- public void setAge(int age)
- {
- this.age =age;
- }
- public int getAge()
- {
- return age;
- }
- //重写hashCode方法
- public int hashCode()
- {
- return name.hashCode()+age*37;
- }
- //重写equals方法
- public boolean equals(Object obj)
- {
- //强制转换Person类型
- Person p = (Person)obj;
- //判断是否为同一个人
- return this.getName().equals(p.getName()) && this.getAge()==p.getAge();
- }
- }
- //主类
- class HashSetTest
- {
- public static void main(String[] args)
- {
- //1 创建HashSet集
- HashSet hs = new HashSet();
- //2 把Person对象存入集合
- hs.add(new Person("Jack",20));
- hs.add(new Person("Jack",20));
- hs.add(new Person("Tom",18));
- hs.add(new Person("Tom",18));
- hs.add(new Person("Mike",19));
- hs.add(new Person("Jane",26));
- //3 取出元素
- for(Iterator it = hs.iterator(); it.hasNext(); )
- {
- //强制转换为Person
- Person p = (Person)it.next();
- System.out.println(p.getName()+"---"+p.getAge());
- }
- }
- }
复制代码
/*
运行结果:
Tom---18
Jane---26
Jack---20
Mike---19
说明已经成功去重了,HashSet中已经不存在同名同年龄的人了!
总结:在HashSet中,存入元素是先判断哈希值是否一样,再判断内容是否一样!
hashset为了保证元素唯一:
1 如果元素哈希值相同,就判断equals是否为true;
2 如果哈希值不相同,不会调用equals方法。
此外,contains()和remove()等操作,HashSet都是依赖hashCode()和equals方法。
所以在类中必须重写这两个方法,才能保证元素唯一!
|
|