1. 程式人生 > >HashSet存儲元素保證唯一性的代碼及圖解

HashSet存儲元素保證唯一性的代碼及圖解

tor port 自定義 ima result string main ide col

需求:存儲自定義對象,並保證元素的唯一性

要求:如果兩個對象的成員變量值都相同,則為同一個元素。

技術分享圖片

示例代碼如下:

  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 }

HashSet存儲元素保證唯一性的代碼及圖解