你的位置:首页 > Java教程

[Java教程]一个有意思的 Java HashSet 问题


昨天,在百度的 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 Person18 {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     else61     {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 有一定的帮助。