歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java 集合:HashSet 與 hashCode、equals

Java 集合:HashSet 與 hashCode、equals

日期:2017/3/1 11:08:31   编辑:Linux編程

大家都說 Java 很簡單,的確 Java 入門不難,但是要想深入了解 Java 那不是一朝一夕能夠做到的!

學習 Java 最重要的一點是要學習其設計思想和設計理念,比如集合框架、IO框架的設計等。

通過一個實例談談 HashSet 與 hashCode、equals 的使用,以及在使用時的注意事項。

設計一個 Person 類,如下:

  1. package mark.zhang;
  2. public class Person {
  3. private String name;
  4. private int age;
  5. public Person(String name, int age) {
  6. super();
  7. this.name = name;
  8. this.age = age;
  9. }
  10. public String getName() {
  11. return name;
  12. }
  13. public int getAge() {
  14. return age;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public void setAge(int age) {
  20. this.age = age;
  21. }
  22. @Override
  23. public String toString() {
  24. return "age=" + age + ", name=" + name;
  25. }
  26. }

這個類很簡單,兩個成員變量以及 set、get 方法,注意這裡沒有重寫 equals、hashCode 方法。為了在打印的時候方便看出結果,重寫 toString 方法。

測試類也照樣很簡單,如下:

  1. public class TestPerson {
  2. public static void main(String[] args) {
  3. Set<Person> set = new HashSet<Person>();
  4. Person p1 = new Person("喜洋洋", 25);
  5. Person p2 = new Person("懶洋洋", 26);
  6. Person p3 = new Person("灰太郎", 27);
  7. set.add(p1);
  8. set.add(p2);
  9. set.add(p3);
  10. System.out.println(set.size() + " 個動畫人物!");
  11. for (Person person : set) {
  12. System.out.println(person);
  13. }
  14. }
  15. }
輸出結果,如下所示:
  1. 3 個動畫人物!
  2. age=27, name=灰太郎
  3. age=26, name=懶洋洋
  4. age=25, name=喜洋洋
ok,看懂上面的程序很簡單,只要你不是初學 Java 的話!但是今天的主題不是只討論這段代碼的難易程度。

如果在代碼中刪除一個“人”,很簡單,只需要調用 remove 方法即可,如下所示:

  1. set.remove(p2);

這個時候,我需要修改 Person 這個類,重寫父類 Object 的兩個方法,equals、hashCode,修改之後的代碼:

  1. package mark.zhang;
  2. public class Person {
  3. private String name;
  4. private int age;
  5. public Person(String name, int age) {
  6. super();
  7. this.name = name;
  8. this.age = age;
  9. }
  10. public String getName() {
  11. return name;
  12. }
  13. public int getAge() {
  14. return age;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public void setAge(int age) {
  20. this.age = age;
  21. }
  22. @Override
  23. public String toString() {
  24. return "age=" + age + ", name=" + name;
  25. }
  26. @Override
  27. public int hashCode() {
  28. final int prime = 31;
  29. int result = 1;
  30. result = prime * result + age;
  31. result = prime * result + ((name == null) ? 0 : name.hashCode());
  32. return result;
  33. }
  34. @Override
  35. public boolean equals(Object obj) {
  36. if (this == obj)
  37. return true;
  38. if (obj == null)
  39. return false;
  40. if (getClass() != obj.getClass())
  41. return false;
  42. Person other = (Person) obj;
  43. if (age != other.age)
  44. return false;
  45. if (name == null) {
  46. if (other.name != null)
  47. return false;
  48. } else if (!name.equals(other.name))
  49. return false;
  50. return true;
  51. }
  52. }
Copyright © Linux教程網 All Rights Reserved