黑马程序员技术交流社区

标题: 关于HashCode [打印本页]

作者: 王宝龙    时间: 2012-9-17 13:55
标题: 关于HashCode
本帖最后由 王宝龙 于 2012-9-18 12:49 编辑

这个程序的输出结果为:wangwu1:24:xian
                                   wangwu8:28:beijing
正常应该输出四个结果啊!
是不是复写的hashCode()有问题啊!大家帮忙看一下 谢谢!!
代码的错误已经找到:
不过还有个问题?
代码1:
while(it.hasNext())
                 {
                         Student stu = it.next();
                         String value = hm.get(stu);
                         System.out.println(stu + " " + value);
                 }
代码2:
while(it.hasNext())
  {
            System.out.println(it.next()+":"+hm.get(it.next()));
  }这两个的输出结果不一样,可是为什么会不一样呢?
  1. import java.util.*;
  2. class Student implements Comparable<Student>
  3. {
  4.         private String name;
  5.         private int age;
  6.         Student(String name,int age)
  7.         {
  8.                 this.name = name;
  9.                 this.age = age;
  10.         }
  11.         public int compareTo(Student s)
  12.         {
  13.                 int num = this.name.compareTo(s.name);
  14.                
  15.                 if(num==0)
  16.                 {
  17.                         return this.age-s.age;
  18.                 }
  19.                 return num;
  20.         }
  21.         public int hashCode()
  22.         {
  23.                 //System.out.println(this.name+"^^hashCode^^"+this.age);
  24.                 return name.hashCode()+age*34;
  25.         }
  26.         public boolean equals(Object obj)
  27.         {
  28.                 if(!(obj instanceof Student))
  29.                         throw new ClassCastException("类型不匹配");
  30.                         
  31.                 Student s = (Student)obj;
  32.                 System.out.println(this.name+"^^^^equals^^^"+s.name);
  33.                 return this.name.equals(s.name)&&this.age==s.age;
  34.         }
  35.         public String getName()
  36.         {
  37.                 return name;
  38.         }
  39.         public int getAge()
  40.         {
  41.                 return age;
  42.         }
  43.         public String toString()
  44.         {
  45.                 return this.getName()+":"+this.getAge();
  46.         }
  47. }
  48. class MapTest
  49. {
  50.         public static void main(String[] arge)
  51.         {
  52.                 HashMap<Student,String> hm = new HashMap<Student,String>();
  53.                
  54.                 hm.put(new Student("wangwu2",23),"beijing");
  55.                 hm.put(new Student("wangwu1",24),"shanghai");
  56.                 hm.put(new Student("wangwu9",26),"xian");
  57.                 hm.put(new Student("wangwu8",28),"nanjing");
  58.                
  59.                 Iterator<Student> it = hm.keySet().iterator();
  60.                
  61.                 while(it.hasNext())
  62.                 {
  63.                         System.out.println(it.next()+":"+hm.get(it.next()));
  64.                 }
  65.                
  66.                
  67.                         
  68.         }
  69. }
  70. <p> </p>
复制代码

作者: 武庆东    时间: 2012-9-17 14:46
本帖最后由 武庆东 于 2012-9-17 15:04 编辑

覆写方法出错!



作者: 谭立文    时间: 2012-9-17 15:01
import java.util.*;

import org.apache.catalina.tribes.group.interceptors.TwoPhaseCommitInterceptor.MapEntry;
class Student implements Comparable<Student>
{
        private String name;
        private int age;
        Student(String name,int age)
        {
                this.name = name;
                this.age = age;
        }
        public int compareTo(Student s)
        {
                int num = this.name.compareTo(s.name);
               
                if(num==0)
                {
                        return this.age-s.age;
                }
                return num;
        }
        public int hashCode()
        {
                //System.out.println(this.name+"^^hashCode^^"+this.age);
                return name.hashCode()+age*34;
        }
        public boolean equals(Object obj)
        {
                if(!(obj instanceof Student))
                        throw new ClassCastException("类型不匹配");
                        
                Student s = (Student)obj;
                System.out.println(this.name+"^^^^equals^^^"+s.name);
                return this.name.equals(s.name)&&this.age==s.age;
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
        public String toString()
        {
                return this.getName()+":"+this.getAge();
        }
}
public class MapTest
{
        public static void main(String[] arge)
        {
                HashMap<Student,String> hm = new HashMap<Student,String>();
               
                hm.put(new Student("wangwu2",23),"beijing");
                hm.put(new Student("wangwu1",24),"shanghai");
                hm.put(new Student("wangwu9",26),"xian");
                hm.put(new Student("wangwu8",28),"nanjing");
               
                Iterator<Student> it = hm.keySet().iterator();
                Set<Map.Entry<Student, String>> s = hm.entrySet();
                for(Map.Entry<Student, String> m:s)
                {
                        Student key = m.getKey();
                        String value = m.getValue();
                        System.out.println(key + " " + value);
                }
                System.out.println("----------------------");
                while(it.hasNext())
                {
                        Student stu = it.next();
                        String value = hm.get(stu);
                        System.out.println(stu + " " + value);
                }
               
               
                        
        }
}
迭代map集合的两种方式注意了,我给你都写出来了,再针对自己的代码再看看。
作者: 王宝龙    时间: 2012-9-17 19:01
本帖最后由 王宝龙 于 2012-9-17 19:05 编辑
谭立文 发表于 2012-9-17 15:01
import java.util.*;

import org.apache.catalina.tribes.group.interceptors.TwoPhaseCommitInterceptor. ...

明白了!!知道哪错了   谢谢了!!!:)

不过还有个问题?
代码1:
while(it.hasNext())
                 {
                         Student stu = it.next();
                         String value = hm.get(stu);
                         System.out.println(stu + " " + value);
                 }
代码2:
while(it.hasNext())
  {
            System.out.println(it.next()+":"+hm.get(it.next()));
  }
这两个的输出不一样可是为什么不一样呢?






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