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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM