• HashSet存储元素保证唯一性的代码及图解


    需求:存储自定义对象,并保证元素的唯一性

    要求:如果两个对象的成员变量值都相同,则为同一个元素。

    示例代码如下:

      1 package cn.itcast_02;
      2 
      3 /**
      4  * @author Administrator
      5  * 
      6  */
      7 public class Student {
      8     private String name;
      9     private int age;
     10 
     11     public Student() {
     12         super();
     13     }
     14 
     15     public Student(String name, int age) {
     16         super();
     17         this.name = name;
     18         this.age = age;
     19     }
     20 
     21     public String getName() {
     22         return name;
     23     }
     24 
     25     public void setName(String name) {
     26         this.name = name;
     27     }
     28 
     29     public int getAge() {
     30         return age;
     31     }
     32 
     33     public void setAge(int age) {
     34         this.age = age;
     35     }
     36 
     37     // 自动生成(快捷方式生成)
     38     @Override
     39     public int hashCode() {
     40         final int prime = 31;
     41         int result = 1;
     42         result = prime * result + age;
     43         result = prime * result + ((name == null) ? 0 : name.hashCode());
     44         return result;
     45     }
     46 
     47     @Override
     48     public boolean equals(Object obj) {
     49         if (this == obj)
     50             return true;
     51         if (obj == null)
     52             return false;
     53         if (getClass() != obj.getClass())
     54             return false;
     55         Student other = (Student) obj;
     56         if (age != other.age)
     57             return false;
     58         if (name == null) {
     59             if (other.name != null)
     60                 return false;
     61         } else if (!name.equals(other.name))
     62             return false;
     63         return true;
     64     }
     65 
     66     /*
     67     @Override
     68     public int hashCode() {
     69         // return 0;
     70         // 因为成员变量的值影响了哈希值,所以我们把成员变量值相加即可
     71         // return this.name.hashCode() + this.age;
     72         // 看下面
     73         // 如果s1:
     74                 name.hashCode() = 40, age = 30
     75          // 如果s2:
     76                 name.hashCode() = 20, age = 50
     77         // 为了尽可能的区分他们,我们可以把它们乘以一些整数,例如如下所示:
     78         return this.name.hashCode() + this.age * 15;
     79     }
     80     
     81     @Override
     82     public boolean equals(Object obj) {
     83         // System.out.println(this + "---" + obj);
     84         if (this == obj) {
     85             return true;
     86         }
     87     
     88         if (!(obj instanceof Student)) {
     89             return false;
     90         }
     91     
     92         Student s = (Student) obj;
     93             return this.name.equals(s.name) && this.age == s.age;
     94     }
     95     
     96     @Override
     97     public String toString() {
     98         return "Student [name=" + name + ", age=" + age + "]";
     99     }
    100     */
    101 
    102 }
     1 package cn.itcast_02;
     2 
     3 import java.util.HashSet;
     4 
     5 /*
     6  * 需求:存储自定义对象,并保证元素的唯一性
     7  * 要求:如果两个对象的成员变量值都相同,则为同一个元素。
     8  * 
     9  *         目前是不符合我的要求的:因为我们知道HashSet底层依赖的是hashCode()和equals()方法。
    10  *         而这两个方法我们在学生类中没有重写,所以,默认使用的是Object类的。
    11  *         这个时候,一般来说,他们的哈希值是不会一样的,根本就不会继续判断了,就执行了添加操作。
    12  */
    13 public class HashSetDemo2 {
    14     public static void main(String[] args) {
    15         // 创建集合对象
    16         HashSet<Student> hs = new HashSet<Student>();
    17 
    18         // 创建学生对象
    19         Student s1 = new Student("林青霞", 27);
    20         Student s2 = new Student("柳岩", 22);
    21         Student s3 = new Student("王祖贤", 30);
    22         Student s4 = new Student("林青霞", 27);
    23         Student s5 = new Student("林青霞", 20);
    24         Student s6 = new Student("范冰冰", 22);
    25 
    26         // 添加元素
    27         hs.add(s1);
    28         hs.add(s2);
    29         hs.add(s3);
    30         hs.add(s4);
    31         hs.add(s5);
    32         hs.add(s6);
    33 
    34         // 遍历集合
    35         for (Student s : hs) {
    36             System.out.println(s.getName() + "---" + s.getAge());
    37         }
    38     }
    39 }
  • 相关阅读:
    地理大发现
    克里斯托弗·哥伦布
    2016. last day in office
    泰斯花粉阻隔剂 怎么使用
    ZT 螨虫知识2
    ZT 螨虫的话就不要跟狗多接触,狗的寄生虫很多,还有草地,
    expense KK [ɪkˋspɛns] DJ [iksˋpens]
    Windows 实战项目 001 文件扫描器 (01)
    017 系统内存信息 内存大小 空闲内存 5
    017 虚拟内存页面区块 4
  • 原文地址:https://www.cnblogs.com/chenmingjun/p/8661041.html
Copyright © 2020-2023  润新知