往HashSet中加入自定义类型时重写Hashcode、equals与不重新写对比

往HashSet集合中存储Person对象,如果姓名和年龄相同,视为同一人同一元素:

[java]  view plain  copy
  1. import java.util.HashSet;  
  2. import java.util.Iterator;  
  3. class Person{  
  4.     String name;  
  5.     int age;  
  6.   
  7.     public Person(){  
  8.         super();  
  9.     }  
  10.     public Person(String name,int age){  
  11.         super();  
  12.         this.name=name;  
  13.         this.age=age;  
  14.     }  
  15.     public String getName(){  
  16.         return name;  
  17.     }  
  18.     public void setName(String name){  
  19.         this.name=name;  
  20.     }  
  21.     public int getAge(){  
  22.         return age;  
  23.     }  
  24.     public void setAge(int age){  
  25.         this.age=age;  
  26.     }  
  27. }  
  28.   
  29. public  class HashSetDemo{  
  30.     public static void main(String[] args){  
  31.         HashSet hs=new HashSet();  
  32.           
  33.         hs.add(new Person("lisi4",24));  
  34.         hs.add(new Person("lisi7",27));  
  35.         hs.add(new Person("lisi1",21));  
  36.         hs.add(new Person("lisi9",29));  
  37.         hs.add(new Person("lisi7",27));  
  38.   
  39.         Iterator it=hs.iterator();  
  40.   
  41.         while(it.hasNext()){  
  42.             Person p=(Person)it.next(); //强制转换  
  43.             System.out.println(p.getName()+":"+p.getAge());  
  44.         }  
  45.     }  
  46. }  
运行结果:


结果虽然是无序的,但是结果中却出现的相同的元素。

HashSet集合数据结构是哈希表,所以存储元素时,使用的是元素的hashCode方法来确定位置,如果位置相同,再通过元素的equals来确定是否相同。

要通过复写hashCode方法和equals方法:

[java]  view plain  copy
  1. import java.util.HashSet;  
  2. import java.util.Iterator;  
  3. class Person{  
  4.     String name;  
  5.     int age;  
  6.   
  7.     public Person(){  
  8.         super();  
  9.     }  
  10.     public Person(String name,int age){  
  11.         super();  
  12.         this.name=name;  
  13.         this.age=age;  
  14.     }  
  15.     public String getName(){  
  16.         return name;  
  17.     }  
  18.     public void setName(String name){  
  19.         this.name=name;  
  20.     }  
  21.     public int getAge(){  
  22.         return age;  
  23.     }  
  24.     public void setAge(int age){  
  25.         this.age=age;  
  26.     }  
  27.   
  28.     public int hashCode(){  //复写hashCode()  
  29.         return name.hashCode()+age;  
  30.     }  
  31.   
  32.     public boolean equals(Object obj){  //复写equals  
  33.   
  34.         if(this==obj) return true;  
  35.   
  36.         if(!(obj instanceof Person)) //instanceof运算符是用来在运行时指出对象是否是特定类的一个实例,返回值是一个布尔类型。这里是判断obj对象是否是Person类的一个实例。  
  37.             throw new ClassCastException("类型错误");  //输入类型错误  
  38.   
  39.         Person p = (Person)obj;//强制转换  
  40.         return this.name.equals(p.name) && this.age==p.age;  //说明姓名和年龄相同则为同一元素  
  41.     }  
  42. }  
  43.   
  44. public  class HashSetDemo{  
  45.     public static void main(String[] args){  
  46.         HashSet hs=new HashSet();  
  47.           
  48.         hs.add(new Person("lisi4",24));  
  49.         hs.add(new Person("lisi7",27));  
  50.         hs.add(new Person("lisi1",21));  
  51.         hs.add(new Person("lisi9",29));  
  52.         hs.add(new Person("lisi7",27));  
  53.   
  54.         Iterator it=hs.iterator();  
  55.   
  56.         while(it.hasNext()){  
  57.             Person p=(Person)it.next(); //强制转换  
  58.             System.out.println(p.getName()+":"+p.getAge());  
  59.         }  
  60.     }  
  61. }  


运行结果:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值