Java基础知识强化之集合框架笔记40:Set集合之HashSet存储自定义对象并遍历
阅读原文时间:2020年09月20日阅读:1

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

2. 代码示例:

(1)Student类,如下:

**package cn.itcast_02;

/**
* @author Administrator
*
*/
public class Student {
private String name;
private int age;

 public Student() {  
     super();  
 }

 public Student(String name, int age) {  
     super();  
     this.name = name;  
     this.age = age;  
 }

 public String getName() {  
     return name;  
 }

 public void setName(String name) {  
     this.name = name;  
 }

 public int getAge() {  
     return age;  
 }

 public void setAge(int age) {  
     this.age = age;  
 }

}**

(2)测试类HashSetDemo2:

**package cn.itcast_02;

import java.util.HashSet;

/*
* 需求:存储自定义对象,并保证元素的唯一性
* 要求:如果两个对象的成员变量值都相同,则为同一个元素。
*
* 目前是不符合我的要求的:因为我们知道HashSet底层依赖的是hashCode()和equals()方法。
* 而这两个方法我们在学生类中没有重写,所以,默认使用的是Object类。
* 这个时候,他们的哈希值是不会一样的,根本就不会继续判断,执行了添加操作。
*/
public class HashSetDemo2 {
public static void main(String[] args) {
// 创建集合对象
HashSet hs = new HashSet();

     // 创建学生对象  
     Student s1 = new Student("林青霞", 27);  
     Student s2 = new Student("柳岩", 22);  
     Student s3 = new Student("王祖贤", 30);  
     Student s4 = new Student("林青霞", 27);  
     Student s5 = new Student("林青霞", 20);  
     Student s6 = new Student("范冰冰", 22);

     // 添加元素  
     hs.add(s1);  
     hs.add(s2);  
     hs.add(s3);  
     hs.add(s4);  
     hs.add(s5);  
     hs.add(s6);

     // 遍历集合  
     for (Student s : hs) {  
         System.out.println(s.getName() + "---" + s.getAge());  
     }  
 }  

}**

运行效果如下:

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

3. 代码示例(修正)

(1)Student类:

**package cn.itcast_02;

/**
* @author Administrator
*
*/
public class Student {
private String name;
private int age;

 public Student() {  
     super();  
 }

 public Student(String name, int age) {  
     super();  
     this.name = name;  
     this.age = age;  
 }

 public String getName() {  
     return name;  
 }

 public void setName(String name) {  
     this.name = name;  
 }

 public int getAge() {  
     return age;  
 }

 public void setAge(int age) {  
     this.age = age;  
 }

 @Override  
 public int hashCode() {  
     final int prime = 31;  
     int result = 1;  
     result = prime \* result + age;  
     result = prime \* result + ((name == null) ? 0 : name.hashCode());  
     return result;  
 }

 @Override  
 public boolean equals(Object obj) {  
     if (this == obj)  
         return true;  
     if (obj == null)  
         return false;  
     if (getClass() != obj.getClass())  
         return false;  
     Student other = (Student) obj;  
     if (age != other.age)  
         return false;  
     if (name == null) {  
         if (other.name != null)  
             return false;  
     } else if (!name.equals(other.name))  
         return false;  
     return true;  
 }

 // @Override  
 // public int hashCode() {  
 // // return 0;  
 // // 因为成员变量值影响了哈希值,所以我们把成员变量值相加即可  
 // // return this.name.hashCode() + this.age;  
 // // 看下面  
 // // s1:name.hashCode()=40,age=30  
 // // s2:name.hashCode()=20,age=50  
 // // 尽可能的区分,我们可以把它们乘以一些整数  
 // return this.name.hashCode() + this.age \* 15;  
 // }  
 //  
 // @Override  
 // public boolean equals(Object obj) {  
 // // System.out.println(this + "---" + obj);  
 // if (this == obj) {  
 // return true;  
 // }  
 //  
 // if (!(obj instanceof Student)) {  
 // return false;  
 // }  
 //  
 // Student s = (Student) obj;  
 // return this.name.equals(s.name) && this.age == s.age;  
 // }  
 //  
 // @Override  
 // public String toString() {  
 // return "Student \[name=" + name + ", age=" + age + "\]";  
 // }

}**

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

**
(2)测试类HashSetDemo2:**

**package cn.itcast_02;

import java.util.HashSet;

/*
* 需求:存储自定义对象,并保证元素的唯一性
* 要求:如果两个对象的成员变量值都相同,则为同一个元素。
*
* 目前是不符合我的要求的:因为我们知道HashSet底层依赖的是hashCode()和equals()方法。
* 而这两个方法我们在学生类中没有重写,所以,默认使用的是Object类。
* 这个时候,他们的哈希值是不会一样的,根本就不会继续判断,执行了添加操作。
*/
public class HashSetDemo2 {
public static void main(String[] args) {
// 创建集合对象
HashSet hs = new HashSet();

     // 创建学生对象  
     Student s1 = new Student("林青霞", 27);  
     Student s2 = new Student("柳岩", 22);  
     Student s3 = new Student("王祖贤", 30);  
     Student s4 = new Student("林青霞", 27);  
     Student s5 = new Student("林青霞", 20);  
     Student s6 = new Student("范冰冰", 22);

     // 添加元素  
     hs.add(s1);  
     hs.add(s2);  
     hs.add(s3);  
     hs.add(s4);  
     hs.add(s5);  
     hs.add(s6);

     // 遍历集合  
     for (Student s : hs) {  
         System.out.println(s.getName() + "---" + s.getAge());  
     }  
 }  

}**

运行效果如下: