昨天,在百度的 java吧 看到有人問關於 HashSet 的問題。下面是他貼出的代碼:
1 import java.util.HashSet; 2 3 public class JavaTest 4 { 5 public static void main(String[] args) 6 { 7 HashSet<Person> hs = new HashSet<Person>(); 8 Person p = new Person("張三", 21); 9 hs.add(p); 10 p.setName("李四"); 11 p.setAge(22); 12 hs.add(p); 13 System.out.println(hs); 14 } 15 } 16 17 class Person 18 { 19 private String name; 20 private int age; 21 22 Person(String name, int age) 23 { 24 this.name = name; 25 this.age = age; 26 } 27 28 public String getName() 29 { 30 return name; 31 } 32 33 public void setName(String name) 34 { 35 this.name = name; 36 } 37 38 public int getAge() 39 { 40 return age; 41 } 42 43 public void setAge(int age) 44 { 45 this.age = age; 46 } 47 48 public int hashCode() 49 { 50 return name.hashCode() + age * 21; 51 } 52 53 public boolean equals(Object obj) 54 { 55 if (obj instanceof Person) 56 { 57 Person p = (Person) obj; 58 return name.equals(p.getName()) && age == p.getAge(); 59 } 60 else 61 { 62 return false; 63 } 64 } 65 66 public String toString() 67 { 68 return name + "--" + age; 69 } 70 }
輸出結果:
[李四--22, 李四--22]
樓主不明白為什么 HashSet 中的兩個元素是一樣的。不是說好了 Set 中不能有重復的元素嗎?
我自信對 HashSet 還比較熟悉(盡管沒研究過源代碼),趕緊寫了個回復,結果還沒說到點子上。
后來樓主又改了一下 equals 方法和測試函數:
import java.util.HashSet; public class JavaTest { public static void main(String[] args) { HashSet<Person> hs = new HashSet<Person>(); Person p = new Person("張三", 21); hs.add(p); p.setName("李四"); p.setAge(22); hs.add(p); hs.add(new Person("李四", 22)); hs.add(new Person("張三", 21)); System.out.println(hs); } } class Person { private String name; private int age; Person(String name, int age) { 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; } public int hashCode() { return name.hashCode() + age * 21; } public boolean equals(Object obj) { //增加了判斷是否為同一個對象 if (this == obj) { return true; } if (obj instanceof Person) { Person p = (Person) obj; return name.equals(p.getName()) && age == p.getAge(); } else { return false; } } public String toString() { return name + "--" + age; } }
輸出結果是:
[李四--22, 李四--22, 張三--21]
如果理解 HashSet 原理,上面的結果倒也不難解釋。
大家看看吧,挺有意思的,我覺得對理解 HashSet 有一定的幫助。