Hashset和数学中的集合的概念一样,不能往集合中放置相同的元素,而如何判断往集合中放置的元素是否相同,则是通过Object类的hashcode和equals方法来确定的,具体的判断过程为:当使用HashSet时候,hashcode方法就会调用,判断已经存储在HashSe中的对象的hashcode值是否和新添加的对象的hashcode值一样,如果不一致,则直接加进去,若一致,再对这个对象进行equals方法的比较,若equals方法返回的是true,则不将新对象添加进去,若是false则添加进去。(这是因为 hash code 相同的对象不一定equals方法返回ture ,简言之就是equal了hashcode一样,不equal了hashcode不一定不一样,有可能一样).注意:往hashset里面存的时候一定是先判断hash code 值。
- package cn.itcast.HashSet;
- import java.util.*;
- class Person
- {
- private String name;
- private int age;
- public Person()
- {
- }
-
- public Person(String name,int age)//定义有参构造函数
- {
- this.name=name;
- this.age=age;
- }
- public void setName(String name)//定义修改name的方法
- {
- this.name=name;
- }
- public String getName()//定义获取name的方法
- {
- return this.name;
- }
- public void setAge()// 定义修改年龄的方法
- {
- this.age=age;
- }
- public int getAge()//定义获取年龄的方法
- {
- return this.age;
- }
- public int hashCode()//重写hashCode()方法
- {
- return name.hashCode()+age*39;
- }
-
- public boolean equals(Object obj)//重写equals方法
- {
- if(this==obj)
- return true;//同一个对象放两次,直接返回true
- if(!(obj instanceof Person))
- throw new ClassCastException("类型错误");
- Person p=(Person)obj;
- return this.name.equals(p.name)&&this.age==p.age;
- }
-
- }
- class HashSetDemo
- {
- public static void main(String[] args)
- {
- HashSet<Person> hs=new HashSet<Person>();
- hs.add(new Person("java01",11));
- hs.add(new Person("java02",22));
- hs.add(new Person("java03",33));
- hs.add(new Person("java04",44));
- hs.add(new Person("java02",22));
- Iterator<Person> it=hs.iterator();//获取迭代器对象
- while(it.hasNext())
- {
- Person p=it.next();
- System.out.println(p.getName()+"::"+p.getAge());
- }
- }
- }
复制代码
|
|