黑马程序员技术交流社区

标题: HashSet的一点疑问 [打印本页]

作者: ┣┫流枫    时间: 2014-8-9 21:54
标题: HashSet的一点疑问
本帖最后由 ┣┫流枫 于 2014-8-10 21:43 编辑

求大婶帮忙看看  咋回事输出结果还是有重复的,
中间加了不少测试代码,实在找不到原因了
代码如下:
  1. package day17;

  2. public class Person {
  3.         private String name;
  4.         private int score;
  5.         public Person(String name,int score){
  6.                 this.name=name;
  7.                 this.score=score;
  8.         }
  9.         public int hashCode(){
  10.                 System.out.println("+++++hashCode++++"+name.hashCode()+score*2);
  11.                 return name.hashCode()+score*12;
  12.         }
  13.         
  14.         public boolean equals(Object obj){
  15.                 System.out.println("=====equals======");
  16.                 if (this==obj) {
  17.                         return true;
  18.                 }
  19.                 if(obj==null){
  20.                         return false;
  21.                 }
  22.                 if(obj instanceof Person){
  23.                         Person per =(Person) obj;
  24.                         return this.name.equals(per.equals(name))&&this.score==per.score;
  25.                 }
  26.                 return false;
  27.         }
  28.         public  String toString(){
  29.                 return "Person "+this.name+"  "+this.score;
  30.         }
  31. }
复制代码
测试函数:
  1. package day17;
  2. import java.util.*;

  3. public class HashSetDemo {
  4.         public static void main(String[] args) {
  5.                 HashSet hs=new HashSet();
  6.                 hs.add(new Person("lisi",23));
  7.                 hs.add(new Person("lisi",23));
  8.                 hs.add(new Person("lisi1",111));
  9.                 hs.add(new Person("lisi1",23));
  10.                
  11.                 Iterator it=hs.iterator();
  12.                 while (it.hasNext()) {
  13.                         Person p=(Person)it.next();
  14.                         System.out.println(p);
  15.                         System.out.println(p.equals(p));
  16. //                        System.out.println(it.next());
  17.                 }
  18.         }
  19. }
复制代码

输出结果:

  1. +++++hashCode++++332200346
  2. +++++hashCode++++332200346
  3. =====equals======
  4. =====equals======
  5. +++++hashCode++++102982142222
  6. +++++hashCode++++10298214246
  7. Person lisi1  23
  8. =====equals======
  9. true
  10. Person lisi  23
  11. =====equals======
  12. true
  13. Person lisi  23
  14. =====equals======
  15. true
  16. Person lisi1  111
  17. =====equals======
  18. true
复制代码




作者: fxwb2005    时间: 2014-8-9 22:23
本帖最后由 fxwb2005 于 2014-8-9 22:28 编辑

return this.name.equals(per.equals(name))&&this.score==per.score;
这句里面你拿per去和name比?应该是:
return this.name.equals(per.name)&&this.score==per.score;
作者: 地狱天堂    时间: 2014-8-9 22:24
Person类,第25行
改为:return this.name.equals(per.name)&&this.score==per.score;
作者: ┣┫流枫    时间: 2014-8-9 22:28
fxwb2005 发表于 2014-8-9 22:23
if (this==obj) {
                        return true;
                }

上面那几行,Java里的源码就有的哦。如果是本身,直接true,如果是null  直接false     就不用比较了   
我看String类复写的Object  都是这么写啊


作者: 一顿一只牛    时间: 2014-8-9 22:31
import java.util.HashSet;
import java.util.Iterator;

/*
* 往hashSet集合中存入对象
*  姓名和年龄视为重复元素。
*
*
* */
public class hashSet {
        public static void main(String[] args){
                HashSet hs = new HashSet();
               
                hs.add(new person("one",20));
                hs.add(new person("two",20));
                hs.add(new person("one",20));
                hs.add(new person("san",22));
                hs.add(new person("san",22));
                hs.add(new person("san",23));
               
                //迭代器,输出集合。
                Iterator it = hs.iterator();
                while(it.hasNext()){
                        person p = (person)it.next();
                        System.out.println(p.getName()+"___"+p.getAge());
                }
        }


}

class person{
        private String name;
        private int age;
         person(String name , int age){
                 this.name = name;
                 this.age = age;
         }
                 public void setName(String name){
                        this.name = name;
                }
                public String getName(){
                        return name;
                }
                public void setAge(int age){
                        this.age = age;
                }
                public int getAge(){
                        return age;
                }
                  //hashCode方法
                public int hashCode(){
                        return name.hashCode()+age;
                }
                 //自定义比较方法,比较名字和年龄。
                public boolean equals(Object obj){
                        if(!(obj instanceof person))
                                return false;
                        person p = (person)obj;
                        return this.name.equals(p.name) && this.age == p.age;
                }
}
     复写equals方法这样代码阅读性比较高吧
                 if(!(obj instanceof person))
                                return false;
                        person p = (person)obj;
                        return this.name.equals(p.name) && this.age == p.age;
判断的时候写错了,比较时出错




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