黑马程序员技术交流社区

标题: HashSet的hashCode和equals重写,然后equals是无效的。为什么? [打印本页]

作者: yefeidd    时间: 2015-8-18 09:21
标题: HashSet的hashCode和equals重写,然后equals是无效的。为什么?
  1. package Container;

  2. import java.util.HashSet;
  3. import java.util.Iterator;


  4. /*
  5. |--Set:元素无序,且不能重复。
  6.         |--HashSet:底层结构是哈希表。
  7.         |--TreeSet:
  8. Set集合的功能和Collection是一致的。
  9. */


  10. class Person1//定义人对象
  11. {
  12.         private String name;
  13.         private int age;
  14.        
  15.         Person1(String name, int age)
  16.         {
  17.                 this.name = name;
  18.                 this.age = age;
  19.         }
  20.        
  21.         public boolean equals(Object obj)//重写equals方法。
  22.         {
  23.                 if(!(obj instanceof Person))
  24.                         return false;
  25.                
  26.                 Person1 p = (Person1)obj;
  27.                 System.out.println(this.name+"----vs----"+p.name);
  28.                 return this.name.equals(p.name)&&this.age==p.age;
  29.                
  30.         }
  31.        
  32.         public int hashCode()//覆盖hashCode重新计算哈希值
  33.         {
  34.                 System.out.println("wo lai jisuan hash!!");
  35.                 return 60;
  36.         }
  37.        
  38.         public String getName()
  39.         {
  40.                 return name;
  41.         }
  42.         public int getAge()
  43.         {
  44.                 return age;
  45.         }
  46. }

  47. public class HashSetDemo {
  48.        
  49.         public static void sop(Object obj)//打印
  50.         {
  51.                 System.out.println(obj);
  52.         }

  53.         public static void main(String[] args) {
  54.                 HashSet<Person1> hs = new HashSet<>();
  55.                
  56.                 hs.add(new Person1("lisa01",21));
  57.                 hs.add(new Person1("lisa02",21));
  58.                 hs.add(new Person1("lisa03",21));
  59.                 hs.add(new Person1("lisa04",21));
  60.                
  61.                 for(Iterator<Person1>it = hs.iterator();it.hasNext();)
  62.                 {
  63.                         Person1 p = it.next();
  64.                         sop(p.getName()+"--------"+p.getAge());
  65.                 }

  66.         }

  67. }
复制代码

作者: 巧克黑力    时间: 2015-8-18 10:01
                if(!(obj instanceof Person))
你定义Person1这里用person。  肯定不对啦,,,
〈>不要带这种括号
作者: yefeidd    时间: 2015-8-18 16:00
巧克黑力 发表于 2015-8-18 10:01
if(!(obj instanceof Person))
你定义Person1这里用person。  肯定不对啦,,,
〈>不要 ...

恩恩  后来我发现了
作者: 阳光下的小树33    时间: 2015-8-18 16:55
这样写是不是效率不高   所有德hashcode都相等  就会比较equals  这个效率是不是很低
作者: yefeidd    时间: 2015-8-29 14:22
阳光下的小树33 发表于 2015-8-18 16:55
这样写是不是效率不高   所有德hashcode都相等  就会比较equals  这个效率是不是很低 ...

这只是个学习用的例子,真正的情况肯定不是所有的hash值一样




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