Java 集合:HashSet 与 hashCode、equals


大家都说 Java 很简单,的确 Java 入门不难,但是要想深入了解 Java 那不是一朝一夕能够做到的!

学习 Java 最重要的一点是要学习其设计思想和设计理念,比如集合框架、IO框架的设计等。

通过一个实例谈谈 HashSet 与 hashCode、equals 的使用,以及在使用时的注意事项。

设计一个 Person 类,如下:

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

这个类很简单,两个成员变量以及 set、get 方法,注意这里没有重写 equals、hashCode 方法。为了在打印的时候方便看出结果,重写 toString 方法。

测试类也照样很简单,如下:

  1. public class TestPerson {  
  2.   
  3.     public static void main(String[] args) {  
  4.         Set<Person> set = new HashSet<Person>();  
  5.         Person p1 = new Person("喜洋洋"25);  
  6.         Person p2 = new Person("懒洋洋"26);  
  7.         Person p3 = new Person("灰太郎"27);  
  8.         set.add(p1);  
  9.         set.add(p2);  
  10.         set.add(p3);  
  11.         System.out.println(set.size() + " 个动画人物!");  
  12.   
  13.         for (Person person : set) {  
  14.             System.out.println(person);  
  15.         }  
  16.     }  
  17. }  
输出结果,如下所示:
  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.   
  3. public class Person {  
  4.   
  5.     private String name;  
  6.     private int age;  
  7.   
  8.     public Person(String name, int age) {  
  9.         super();  
  10.         this.name = name;  
  11.         this.age = age;  
  12.     }  
  13.   
  14.     public String getName() {  
  15.         return name;  
  16.     }  
  17.   
  18.     public int getAge() {  
  19.         return age;  
  20.     }  
  21.   
  22.     public void setName(String name) {  
  23.         this.name = name;  
  24.     }  
  25.   
  26.     public void setAge(int age) {  
  27.         this.age = age;  
  28.     }  
  29.   
  30.     @Override  
  31.     public String toString() {  
  32.         return "age=" + age + ", name=" + name;  
  33.     }  
  34.   
  35.     @Override  
  36.     public int hashCode() {  
  37.         final int prime = 31;  
  38.         int result = 1;  
  39.         result = prime * result + age;  
  40.         result = prime * result + ((name == null) ? 0 : name.hashCode());  
  41.         return result;  
  42.     }  
  43.   
  44.     @Override  
  45.     public boolean equals(Object obj) {  
  46.         if (this == obj)  
  47.             return true;  
  48.         if (obj == null)  
  49.             return false;  
  50.         if (getClass() != obj.getClass())  
  51.             return false;  
  52.         Person other = (Person) obj;  
  53.         if (age != other.age)  
  54.             return false;  
  55.         if (name == null) {  
  56.             if (other.name != null)  
  57.                 return false;  
  58.         } else if (!name.equals(other.name))  
  59.             return false;  
  60.         return true;  
  61.     }  
  62.   
  63. }  
  • 1
  • 2
  • 3
  • 下一页

相关内容