A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 七年锦·旅行 中级黑马   /  2014-6-6 15:59  /  1179 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  小白在看毕向东老师的Java基础视频时遇到了问题,视频是第14天的,是关于集合中的HashSet的内容
     需求如下:
                  给HashSet集合中存入自定义对象,姓名和年龄相同为同一个人,去除重复元素

  问题是:为什么打印的结果还是出现了重复的元素,找不到原因?请各位路过的大神号脉!

打印结果:
zhangsan01...25
zhangsan03...21
zhangsan02...26
zhangsan02...26

以下是代码部分:

package com.itheima.day14;

import java.util.HashSet;
import java.util.Iterator;

class personHuman{
        private String name;
        private int age;
        personHuman(String name,int age){
                this.name = name;
                this.age = age;
        }
       
           //覆盖personHuman类的hashCode()方法,建立其对象自己的哈希值
        public int hashCode(){
               
                //为了保证哈希值的唯一性所以乘以39
                return name.hashCode()+age*39;
        }
       
        //重写Object中的equals()
        public boolean equals(Object obj){
                if(!(obj instanceof Person))
                        return false;
                personHuman p = (personHuman)obj;
                return this.name.equals(p.name) && this.age==p.age;
        }
        public String getName(){
                return name;
        }
       
        public int getAge(){
                return age;
          }
       
}

class HashSetTest {
       
       //定义了一个打印方法
        public static void sop(Object obj){
                System.out.println(obj);
        }

        public static void main(String[] args) {
                HashSet hs = new HashSet();
               
                //存入以后就在哈希表里面产生4个不同哈希值,有了4个不同位置的存储,就不用再读equals()
                hs.add(new personHuman("zhangsan01",25));
                hs.add(new personHuman("zhangsan02",26));
                hs.add(new personHuman("zhangsan03",21));
                hs.add(new personHuman("zhangsan02",26));
                //hs.add(new personHuman("zhangsan04",30));
               
                Iterator it = hs.iterator();
               
                while(it.hasNext()){
                        personHuman p = (personHuman)it.next();
                        sop(p.getName()+"..."+p.getAge());
                  }

        }
       
}

7 个回复

倒序浏览
你把重写的equals方法里的那个if()中的Person改成personHumen应该就好了吧,对象名称写错了吧~
回复 使用道具 举报 1 0
这一句    if(!(obj instanceof Person))  你代码里面就没有person类 只有personHumen 所以!(obj instanceof Person)恒为真, 每次都返回false 集合就判断两个元素是不一样的。所以出现了重复元素

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我来学习了!!!!!!!!!!!!
回复 使用道具 举报 1 0
苗润 发表于 2014-6-6 17:29
这一句    if(!(obj instanceof Person))  你代码里面就没有person类 只有personHumen 所以!(obj instanceo ...

对的,不仔细看的话还不容易察觉出来,楼主要仔细哟
回复 使用道具 举报 1 0
我是来学习的
回复 使用道具 举报
  1. package com.itheima.day14;

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

  4. class personHuman{
  5.         private String name;
  6.         private int age;
  7.         personHuman(String name,int age){
  8.                 this.name = name;
  9.                 this.age = age;
  10.         }
  11.         
  12.            //覆盖personHuman类的hashCode()方法,建立其对象自己的哈希值
  13.         public int hashCode(){
  14.                
  15.                 //为了保证哈希值的唯一性所以乘以39
  16.                 return name.hashCode()+age*39;
  17.         }
  18.         
  19.         //重写Object中的equals()
  20.         public boolean equals(Object obj){
  21. [color=Red]//这个地方有问题
  22. [/color]                if(!(obj instanceof personHuman))
  23.                         return false;
  24.                 personHuman p = (personHuman)obj;
  25.                 return this.name.equals(p.name) && this.age==p.age;
  26.         }
  27.         public String getName(){
  28.                 return name;
  29.         }
  30.         
  31.         public int getAge(){
  32.                 return age;
  33.           }
  34.         
  35. }

  36. class HashSetTest {
  37.         
  38.        //定义了一个打印方法
  39.         public static void sop(Object obj){
  40.                 System.out.println(obj);
  41.         }

  42.         public static void main(String[] args) {
  43.                 HashSet hs = new HashSet();
  44.                
  45.                 //存入以后就在哈希表里面产生4个不同哈希值,有了4个不同位置的存储,就不用再读equals()
  46.                 hs.add(new personHuman("zhangsan01",25));
  47.                 hs.add(new personHuman("zhangsan02",26));
  48.                 hs.add(new personHuman("zhangsan03",21));
  49.                 hs.add(new personHuman("zhangsan02",26));
  50.                 //hs.add(new personHuman("zhangsan04",30));
  51.                
  52.                 Iterator it = hs.iterator();
  53.                
  54.                 while(it.hasNext()){
  55.                         personHuman p = (personHuman)it.next();
  56.                         sop(p.getName()+"..."+p.getAge());
  57.                   }

  58.         }
  59.         
  60. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 1
我来学习啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马