Set接口的常用子类(3)

本文介绍了Java中Set接口子类HashSet如何处理重复元素,包括equals()和hashCode()方法的重要性及其在去除重复元素中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

13.4.2  Set接口的常用子类(3)

4.关于重复元素的说明

在讲解之前,先来观察以下的代码,并观察其输出。

范例:加入重复对象

  1. package org.lxh.demo13.setdemo;  
  2. import java.util.HashSet;  
  3. import java.util.Set;  
  4. class Person {                                      // 定义Person类  
  5.     private String name;                            // 定义name属性  
  6.     private int age;                                // 定义age属性  
  7.     public Person(String name, int age) {           // 通
    过构造方法为属性赋值
     
  8.         this.name = name;                           // 为name属性赋值  
  9.         this.age = age;                             // 为age属性赋值  
  10.     }  
  11.     public String toString() {                      // 覆写toString()方法  
  12.         return "姓名:" + this.name + ";年龄:" + this.age;  
  13.     }  
  14. }  
  15. public class RepeatDemo01 {  
  16.     public static void main(String[] args) {  
  17.         Set<Person> allSet = new HashSet<Person>();// 实
    例化Set接口对象
     
  18.         allSet.add(new Person("张三"30));           // 加入元素  
  19.         allSet.add(new Person("李四"31));           // 加入元素  
  20.         allSet.add(new Person("王五"32));           // 加入元素  
  21.         allSet.add(new Person("王五"32));       // 重复元素,不能加入  
  22.         allSet.add(new Person("王五"32));       // 重复元素,不能加入  
  23.         allSet.add(new Person("赵六"33));           // 加入元素  
  24.         allSet.add(new Person("孙七"33));       // 年龄重复  
  25.         System.out.println(allSet);                 // 输出集合,调用  
  26. toString()  
  27.     }  

程序运行结果:

  1. [姓名:王五;年龄:32, 姓名:李四;年龄:31, 姓名:王五;
    年龄:32, 姓名:赵六;年龄:33, 姓名:张三;年龄:30,
    姓名:孙七;年龄:33, 姓名:王五;年龄:32

从程序的运行结果中可以发现,"王五"的内容重复了,也就是说,此时的程序并没有像Set接口规定的那样是不允许有重复元素的,而如果此时想要去掉重复元素,则必须首先进行对象是否重复的判断,而要想进行这样的判断则一个类中就必须覆写Object类中的equals()方法,才能完成对象是否相等的判断,但是只覆写equals()方法是不够的,还需要覆写hashCode()方法,此方法表示一个哈希编码,可以简单地理解为表示一个对象的编码。一般的哈希码是通过公式进行计算的,可以将类中的全部属性进行适当的计算,以求出一个不会重复的哈希码。

范例:去掉重复元素

  1. package org.lxh.demo13.setdemo;  
  2. import java.util.HashSet;  
  3. import java.util.Set;  
  4. class Person {                                      // 定义Person类  
  5.     private String name;                            // 定义name属性  
  6.     private int age;                                // 定义age属性  
  7.     public Person(String name, int age) {           // 通过构
    造方法为属性赋值
     
  8.         this.name = name;                           // 为name属性赋值  
  9.         this.age = age;                             // 为age属性赋值  
  10.     }  
  11.     public boolean equals(Object obj) {         // 覆写equals()方法  
  12.         if (this == obj) {                          // 地址相等  
  13.             return true;                            // 是同一个对象  
  14.         }  
  15.         if (!(obj instanceof Person)) {             // 传递进来
    的不是本类的对象
     
  16.             return false;                           // 不是同一个对象  
  17.         }  
  18.         Person p = (Person) obj;                    // 进行向下转型  
  19.         if (this.name.equals(p.name) && this.age == p.age) {  
  20.             return true ;                           // 属性依次比较  
  21.         }else{                                      // 全部属性相等,
    是同一对象
     
  22.             return false ;                          // 属性不相等,
    不是同一对象
     
  23.         }  
  24.     }  
  25.     public int hashCode(){                          // 覆写hashCode()方法  
  26.         return this.name.hashCode() * this.age ;    // 指定编码公式  
  27.     }  
  28.     public String toString() {                      // 覆写toString()方法  
  29.         return "姓名:" + this.name + ";年龄:" + this.age;  
  30.     }  
  31. }  
  32. public class RepeatDemo02 {  
  33.     public static void main(String[] args) {  
  34.         Set<Person> allSet = new HashSet<Person>();// 实例化Set接口对象  
  35.         allSet.add(new Person("张三"30));           // 加入元素  
  36.         allSet.add(new Person("李四"31));           // 加入元素  
  37.         allSet.add(new Person("王五"32));           // 加入元素  
  38.         allSet.add(new Person("王五"32));       // 重复元素,不能加入  
  39.         allSet.add(new Person("王五"32));       // 重复元素,不能加入  
  40.         allSet.add(new Person("赵六"33));           // 加入元素  
  41.         allSet.add(new Person("孙七"33));       // 年龄重复  
  42.         System.out.println(allSet);                 // 输出集合,调用  
  43. toString()  
  44.     }  

程序运行结果:

  1. [姓名:王五;年龄:32, 姓名:李四;年龄:31
    姓名:张三;年龄:30, 姓名:孙七;年龄:33, 姓名:赵六;年龄:33

从最后输出的结果中可以发现,集合中的重复内容消失了,就是因为equals和hashCode共同作用的结果。

U提示:Object类总结。

经过以上程序代码的学习,Object类中的全部方法就介绍完了,相信读者应该清楚地知道了各个方法的作用。在实际的开发中经常会碰到区分同一对象的问题,所以,一个完整的类最好覆写Object类的hashCode()、equals()、toString() 3个方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值