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 }

运行效果如下:

posted on 2015-10-06 16:39  鸿钧老祖  阅读(453)  评论(0编辑  收藏  举报

导航