黑马程序员技术交流社区

标题: 【关于集合】为什么用Map.Entry的getKey,得到的是hash值 [打印本页]

作者: 龚首道    时间: 2013-8-23 01:47
标题: 【关于集合】为什么用Map.Entry的getKey,得到的是hash值
本帖最后由 龚首道 于 2013-8-24 20:02 编辑

如题,我有以下所示代码,为什么我遍历后,Map.Entry的getKey返回的是hash值。为什么?
  1. import java.util.HashMap;
  2. import java.util.Iterator;
  3. import java.util.Map;
  4. import java.util.Set;


  5. public class HashMapDemo {

  6.         /**
  7.          * @param args
  8.          */
  9.         public static void main(String[] args) {
  10.                 // TODO Auto-generated method stub
  11.                 HashMap<Student,String> hshmp = new HashMap<Student,String>();
  12.                 hshmp.put(new Student("gong",22), "shanghai");
  13.                 hshmp.put(new Student("haohao",23), "beijing");
  14.                
  15.                 Set<Map.Entry<Student,String>> me = hshmp.entrySet();
  16.                 for(Iterator<Map.Entry<Student,String>> it = me.iterator();it.hasNext();)
  17.                 {
  18.                         Map.Entry<Student, String> mapentr = it.next();
  19.                         Student stu = mapentr.getKey();
  20.                         System.out.println("Stu:"+stu+",add:"+mapentr.getValue());
  21.                 }
  22.         }

  23. }
  24. class Student implements Comparable<Student>
  25. {

  26.         private String name;
  27.         private int age;
  28.         public Student(String n,int a)
  29.         {
  30.                 this.name = n;
  31.                 this.age = a;
  32.                
  33.         }
  34.         public void setAge(int a)
  35.         {
  36.                 this.age = a;
  37.         }
  38.         public int getAge()
  39.         {
  40.                 return this.age;
  41.         }
  42.         public void setName(String n)
  43.         {
  44.                 this.name = n;
  45.         }
  46.         public String getName()
  47.         {
  48.                 return this.name;
  49.         }
  50.         @Override
  51.         public int compareTo(Student o) {
  52.                 // TODO Auto-generated method stub
  53.                 int num = new Integer(this.age).compareTo(new Integer(o.age));
  54.                 if(num == 0)
  55.                         return (this.name).compareTo(o.name);
  56.                 return num;
  57.         }
  58.         @Override
  59.         public boolean equals(Object obj)
  60.         {
  61.                 if(!(obj instanceof Student))
  62.                         throw new ClassCastException("类型异常");
  63.                 Student stu = (Student)obj;
  64.                 return this.name.equals(stu.name) && this.age == stu.age;
  65.         }
  66.         public int hashCode()
  67.         {
  68.                 return name.hashCode()+age*34;
  69.         }
  70.         
  71. }
复制代码

作者: gulup    时间: 2013-8-23 02:18
哥们。。。你的Student类没有覆盖toString方法啊。。。直接输出了stu当然给你返回来Hash值啊。。。。
作者: 龚首道    时间: 2013-8-23 10:31
gulup 发表于 2013-8-23 02:18
哥们。。。你的Student类没有覆盖toString方法啊。。。直接输出了stu当然给你返回来Hash值啊。。。。 ...

原来如此。我再试试

作者: ccyznhy    时间: 2013-8-23 10:38
本帖最后由 ccyznhy 于 2013-8-23 10:39 编辑

student没有覆盖toString()方法,常见问题啊啊啊
作者: ccyznhy    时间: 2013-8-23 10:42
isFile()
          测试此抽象路径名表示的文件是否是一个标准文件
isDirectory()
          测试此抽象路径名表示的文件是否是一个目录
这2个方法就是File类中用来判断文件和文件夹也就是目录的方法
作者: 坚持远方    时间: 2013-8-23 10:58
因为你没有覆盖toString方法,而且你key中存储的是对象,所以获取到的就是哈希值
作者: 一个铃,一颗珠    时间: 2013-8-23 11:08
  for(Iterator<Map.Entry<Student,String>> it = me.iterator();it.hasNext();)

         {

                 Map.Entry<Student, String> mapentr = it.next();

                 Student stu = mapentr.getKey();
                 String name = stu.getName();
                 int age =stu.getAge();
                 System.out.println("StuName:"+name+",StuAage:"+age+",add:"+mapentr.getValue());

         }
这种方式也可以得到你要的值
作者: 黄兴旺    时间: 2013-8-23 16:49
亲  如果问题已解决请把类别改为已解决,谢谢。
作者: 杨增坤    时间: 2013-8-23 19:51
如果问题解决了,请把问题的未解决更改为已解决
谢谢合作!




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