一个有意思的 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 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 有一定的帮助。

 

posted on 2016-04-28 12:30  小米干饭  阅读(980)  评论(7编辑  收藏  举报

导航