黑马程序员技术交流社区

标题: HashSet集合可以只复写hashCode,不复写equals吗? [打印本页]

作者: 徐鹏辰    时间: 2015-8-5 13:17
标题: HashSet集合可以只复写hashCode,不复写equals吗?
本帖最后由 徐鹏辰 于 2015-8-5 14:19 编辑
  1. <p>import java.util.*;
  2. import java.lang.*;
  3. class HashSetTest
  4. {
  5.         //输出方法
  6.         public static void sop(Object obj)
  7.         {
  8.                 System.out.println(obj);
  9.         }
  10.         public static void main(String[] args)
  11.         {
  12.                 //建立HashSet集合
  13.                 HashSet hs = new HashSet();
  14.                 //添加元素
  15.                 hs.add(new Person("a1",11));
  16.                 hs.add(new Person("a2",12));
  17.                 hs.add(new Person("a3",13));
  18.                 hs.add(new Person("a2",12));
  19. </p><p>
  20.                 HashSet hs1 = new HashSet();
  21.                 //添加元素
  22.                 hs1.add(new Person(11));
  23.                 hs1.add(new Person(12));
  24.                 hs1.add(new Person(13));
  25.                 hs1.add(new Person(13));</p><p>
  26.                 HashSet hs2 = new HashSet();
  27.                 //添加元素
  28.                 hs2.add(new Person("z"));
  29.                 hs2.add(new Person("v"));
  30.                 hs2.add(new Person("b"));
  31.                 hs2.add(new Person("z"));

  32.                 Iterator it = hs2.iterator();

  33.                 while(it.hasNext())
  34.                 {
  35.                         Person p = (Person)it.next();
  36.                         sop(p.getName());
  37.                         //sop(p.getAge())

  38.                         //sop(p.getName()+","+p.getAge()+"--"+Integer.toHexString(p.hashCode())+"---"+p);
  39.                 }
  40.         }
  41. }
  42. //自定义对象
  43. class Person
  44. {
  45.         private String name;
  46.         private int age;
  47.         Person(String name)
  48.         {
  49.                 this.name = name;
  50.         }
  51.         Person(int age)
  52.         {
  53.                 this.age = age;
  54.         }
  55.         Person(String name,int age)
  56.         {
  57.                 this.age = age;
  58.                 this.name = name;
  59.                
  60.         }
  61.         //自定义hash值
  62.         public int hashCode()
  63.         {
  64.                 //判断谁调用了该方法
  65.                 //System.out.println(this.name+"....hashCode");
  66.                 //return name.hashCode()+age*37;
  67.                 return 60;
  68.         }
  69.         
  70.         //比较对象方法
  71.         /*
  72.         public boolean equals(Object obj)
  73.         {
  74.                 //判断是否属于Person类,不属于则直接返回。
  75.                 if(!(obj instanceof Person))
  76.                         return false;
  77.                 //类型的强制转换
  78.                 Person p = (Person)obj;
  79.                 //判断方法是否调用,进而演示对象的比较过程
  80.                 //System.out.println(this.name+"...equals.."+p.name);
  81.                 //return this.name.equals(p.name) && this.age == p.age;//特有的比较方式
  82.         }
  83.         */
  84.         //获取对象属性
  85.         public String getName()
  86.         {
  87.                 return name;
  88.         }
  89.         public int getAge()
  90.         {
  91.                 return age;
  92.         }
  93. }</p>
复制代码

HashSet集合只复写hashCode,不复写Object类equals!
    Object类中的equals方法比较的地址值。
    String类中equals方法复写了Object类equals方法,特有的比较方式,比较字符串是否相同。
HashSet集合为何还有重复,不是应该比较地址值吗?是我哪里理解或者记错了!!






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2