往HashSet集合中存储Person对象,如果姓名和年龄相同,视为同一人同一元素:
- import java.util.HashSet;
- import java.util.Iterator;
- class Person{
- String name;
- int age;
- public Person(){
- super();
- }
- public Person(String name,int age){
- super();
- this.name=name;
- this.age=age;
- }
- public String getName(){
- return name;
- }
- public void setName(String name){
- this.name=name;
- }
- public int getAge(){
- return age;
- }
- public void setAge(int age){
- this.age=age;
- }
- }
- public class HashSetDemo{
- public static void main(String[] args){
- HashSet hs=new HashSet();
- hs.add(new Person("lisi4",24));
- hs.add(new Person("lisi7",27));
- hs.add(new Person("lisi1",21));
- hs.add(new Person("lisi9",29));
- hs.add(new Person("lisi7",27));
- Iterator it=hs.iterator();
- while(it.hasNext()){
- Person p=(Person)it.next(); //强制转换
- System.out.println(p.getName()+":"+p.getAge());
- }
- }
- }
结果虽然是无序的,但是结果中却出现的相同的元素。
HashSet集合数据结构是哈希表,所以存储元素时,使用的是元素的hashCode方法来确定位置,如果位置相同,再通过元素的equals来确定是否相同。
要通过复写hashCode方法和equals方法:
- import java.util.HashSet;
- import java.util.Iterator;
- class Person{
- String name;
- int age;
- public Person(){
- super();
- }
- public Person(String name,int age){
- super();
- this.name=name;
- this.age=age;
- }
- public String getName(){
- return name;
- }
- public void setName(String name){
- this.name=name;
- }
- public int getAge(){
- return age;
- }
- public void setAge(int age){
- this.age=age;
- }
- public int hashCode(){ //复写hashCode()
- return name.hashCode()+age;
- }
- public boolean equals(Object obj){ //复写equals
- if(this==obj) return true;
- if(!(obj instanceof Person)) //instanceof运算符是用来在运行时指出对象是否是特定类的一个实例,返回值是一个布尔类型。这里是判断obj对象是否是Person类的一个实例。
- throw new ClassCastException("类型错误"); //输入类型错误
- Person p = (Person)obj;//强制转换
- return this.name.equals(p.name) && this.age==p.age; //说明姓名和年龄相同则为同一元素
- }
- }
- public class HashSetDemo{
- public static void main(String[] args){
- HashSet hs=new HashSet();
- hs.add(new Person("lisi4",24));
- hs.add(new Person("lisi7",27));
- hs.add(new Person("lisi1",21));
- hs.add(new Person("lisi9",29));
- hs.add(new Person("lisi7",27));
- Iterator it=hs.iterator();
- while(it.hasNext()){
- Person p=(Person)it.next(); //强制转换
- System.out.println(p.getName()+":"+p.getAge());
- }
- }
- }
运行结果: