• Java基础知识强化之集合框架笔记40:Set集合之HashSet存储自定义对象并遍历


    1. HashSet存储自定义对象并遍历

    2. 代码示例:

    (1)Student类,如下:

     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 }

    (2)测试类HashSetDemo2:

     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 }

    运行效果如下:

      目前是不符合我的要求的:因为我们知道HashSet底层依赖的是hashCode()和equals()方法。 而这两个方法我们在学生类中没有重写,所以,默认使用的是Object类。这个时候,他们的哈希值是不会一样的,根本就不会继续判断,执行了添加操作。

    3. 代码示例(修正)

    (1)Student类:

     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     @Override
    38     public int hashCode() {
    39         final int prime = 31;
    40         int result = 1;
    41         result = prime * result + age;
    42         result = prime * result + ((name == null) ? 0 : name.hashCode());
    43         return result;
    44     }
    45 
    46     @Override
    47     public boolean equals(Object obj) {
    48         if (this == obj)
    49             return true;
    50         if (obj == null)
    51             return false;
    52         if (getClass() != obj.getClass())
    53             return false;
    54         Student other = (Student) obj;
    55         if (age != other.age)
    56             return false;
    57         if (name == null) {
    58             if (other.name != null)
    59                 return false;
    60         } else if (!name.equals(other.name))
    61             return false;
    62         return true;
    63     }
    64 
    65     // @Override
    66     // public int hashCode() {
    67     // // return 0;
    68     // // 因为成员变量值影响了哈希值,所以我们把成员变量值相加即可
    69     // // return this.name.hashCode() + this.age;
    70     // // 看下面
    71     // // s1:name.hashCode()=40,age=30
    72     // // s2:name.hashCode()=20,age=50
    73     // // 尽可能的区分,我们可以把它们乘以一些整数
    74     // return this.name.hashCode() + this.age * 15;
    75     // }
    76     //
    77     // @Override
    78     // public boolean equals(Object obj) {
    79     // // System.out.println(this + "---" + obj);
    80     // if (this == obj) {
    81     // return true;
    82     // }
    83     //
    84     // if (!(obj instanceof Student)) {
    85     // return false;
    86     // }
    87     //
    88     // Student s = (Student) obj;
    89     // return this.name.equals(s.name) && this.age == s.age;
    90     // }
    91     //
    92     // @Override
    93     // public String toString() {
    94     // return "Student [name=" + name + ", age=" + age + "]";
    95     // }
    96 
    97 }

    上面的hashCode 和 equals方法 都是使用Eclipse自动生成的


    (2)测试类HashSetDemo2:

     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 }

    运行效果如下:

  • 相关阅读:
    EasyUI datagrid动态加载json数据
    Java缓存机制
    爬虫入门 手写一个Java爬虫
    java解决前后台跨域问题
    HttpUrlConnection 基础使用
    聊聊spring-boot-starter-data-redis的配置变更
    Linux命令: 结束命令
    Linux其他: GitBash
    Python: 字典dict: 相同点
    Python: 字典dict: zip()
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4857331.html
Copyright © 2020-2023  润新知