zoukankan      html  css  js  c++  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 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 有一定的帮助。

  • 相关阅读:
    C#基础知识之Dynamic类型
    C#基础知识之Partial
    C#基础知识之System.AppDomain类
    C#基础知识之事件和委托
    C#基础知识之正则表达式
    linux基本命令
    async和await的用法
    使用jQuery的replaceWith()方法要注意的地方
    JS通过指定大小来压缩图片
    js对url进行编码的方法(encodeURI和 encodeURICompoent())
  • 原文地址:https://www.cnblogs.com/xiaomiganfan/p/5442189.html
Copyright © 2011-2022 走看看