黑马程序员技术交流社区

标题: 为啥一样的代码,我输出的就是地址呢? [打印本页]

作者: 陈中岩    时间: 2013-4-12 01:06
标题: 为啥一样的代码,我输出的就是地址呢?
本帖最后由 陈中岩 于 2013-4-12 18:33 编辑
  1. import java.util.HashMap;
  2. import java.util.Iterator;
  3. import java.util.Map;
  4. import java.util.Set;

  5. /**练习
  6. * 每一个学生都有对应的归属地。
  7. * 学生Student,地址String.
  8. * 学生属性:姓名,年龄。
  9. * 注意:姓名和年龄相同的视为同一个学生.
  10. * 保证学生的唯一性.
  11. *
  12. * @author Chen_zyan
  13. *
  14. * 1,描述学生。
  15. * 2,定义map容器,将学生作为键,地址作为值。存入.
  16. * 3,获取map集合中的元素.
  17. */
  18. //注意,以后写的时候一定要做这几个动作:1,实现Comparable,2,覆盖hashCode与equals方法
  19. //定义学生,因为有可能会存储到二叉树当中,所以要覆写二叉树方法,实现Comparable
  20. class Student implements Comparable<Student>
  21. {
  22.         private String name;
  23.         private int age;
  24.         Student(String name,int age)
  25.         {
  26.                 this.name = name;
  27.                 this.age = age;
  28.         }
  29.         //覆写
  30.         public int compareTo(Student s)
  31.         {
  32.                 int num = new Integer(this.age).compareTo(new Integer(s.age));
  33.                 if(num == 0)
  34.                 {
  35.                         return this.name.compareTo(s.name);
  36.                 }
  37.                 return num;
  38.         }
  39.         
  40.         //覆盖两个方法
  41.         public int hashCode()
  42.         {
  43.                 return name.hashCode()+age*22;
  44.         }
  45.         public boolean equals(Object obj)
  46.         {
  47.                 if(!(obj instanceof Student))
  48.                         throw new ClassCastException("类型不匹配");
  49.                 Student s = (Student)obj;
  50.                
  51.                 return this.name.equals(s.name) && this.age == s.age;
  52.         }
  53.         
  54.         public String getName()
  55.         {
  56.                 return name;
  57.         }
  58.         public int getAge()
  59.         {
  60.                 return age;
  61.         }

  62. }



  63. class MapTest1 {
  64.         public static void main(String[] args)
  65.         {
  66.                 HashMap<Student,String> hm = new HashMap<Student,String>();
  67.                
  68.                 hm.put(new Student("lisi1",21),"beijing");
  69.                 hm.put(new Student("lisi2",22),"shanghai");
  70.                 hm.put(new Student("lisi3",23),"nanjing");
  71.                 hm.put(new Student("lisi4",24),"wuhan");
  72.                
  73.                 //第一种取出方式keySet
  74.                 Set<Student> keySet = hm.keySet();
  75.                
  76.                 Iterator<Student> it = keySet.iterator();
  77.                
  78.                 while(it.hasNext())
  79.                 {
  80.                         Student stu = it.next();
  81.                         String addr = hm.get(stu);
  82.                         System.out.println(stu+"...."+addr);
  83.                 }
  84.                
  85.                 //第二种取出方式
  86.                
  87.                 Set<Map.Entry<Student, String>> entrySet = hm.entrySet();
  88.                
  89.                 Iterator<Map.Entry<Student, String>> iter = entrySet.iterator();
  90.                
  91.                 while(iter.hasNext())
  92.                 {
  93.                         Map.Entry<Student, String> map = iter.next();
  94.                         Student stu = map.getKey();
  95.                         String addrs = map.getValue();
  96.                         System.out.println(stu+"............"+addrs);
  97.                 }
  98.         }
  99. }
复制代码
下面是我输出的结果
test.Student@62363cc....beijing
test.Student@62363fa....nanjing
test.Student@6236411....wuhan
test.Student@62363e3....shanghai
test.Student@62363cc............beijing
test.Student@62363fa............nanjing
test.Student@6236411............wuhan
test.Student@62363e3............shanghai
下面是我想要的输出结果
lisi1:21....beijing

lisi1:21............beijing

作者: 黑马19我最牛    时间: 2013-4-12 01:22
Student   类,你需要覆写toString()方法,   用来输出,你对象特有的字符串表现方法 ,如果没有覆写toString()方法   ,那个有个从Object类中继承下来的一个toString()方法  ,这个toString()方法打印的是哈希值
作者: 朱盛文    时间: 2013-4-12 01:54
  1. class MapTest1 {
  2.         public static void main(String[] args)
  3.         {
  4.                 HashMap<Student,String> hm = new HashMap<Student,String>();
  5.                
  6.                 hm.put(new Student("lisi1",21),"beijing");
  7.                 hm.put(new Student("lisi2",22),"shanghai");
  8.                 hm.put(new Student("lisi3",23),"nanjing");
  9.                 hm.put(new Student("lisi4",24),"wuhan");
  10.                
  11.                 //第一种取出方式keySet
  12.                 Set<Student> keySet = hm.keySet();
  13.                
  14.                 Iterator<Student> it = keySet.iterator();
  15.                
  16.                 while(it.hasNext())
  17.                 {
  18.                         Student stu = it.next();
  19.                         String addr = hm.get(stu);
  20.                         System.out.println(stu.getName()+":"+stu.getAge()+"...."+addr);     //打印输出时这样修改就行了,因为 stu 是一个对象,如果直接打印,输出的就是它的地址值。要想直接调用stu打印出其name和age,一个方法是重写Student类的toString方法,另外一个就是我上面说的这种方法。因为对象类从Object这个超类中继承了toString方法,其默认返回的就是一个地址值。
  21.                 }
  22.                
  23.                 //第二种取出方式
  24.                
  25.                 Set<Map.Entry<Student, String>> entrySet = hm.entrySet();
  26.                
  27.                 Iterator<Map.Entry<Student, String>> iter = entrySet.iterator();
  28.                
  29.                 while(iter.hasNext())
  30.                 {
  31.                         Map.Entry<Student, String> map = iter.next();
  32.                         Student stu = map.getKey();
  33.                         String addrs = map.getValue();
  34.                         System.out.println(stu.getName()+":"+stu.getAge()+"............"+addrs);
  35.                 }
  36.         }
  37. }
复制代码

作者: 孙金鑫    时间: 2013-4-12 02:53
//第一种取出方式keySet

                Set<Student> keySet = hm.keySet();

               

                Iterator<Student> it = keySet.iterator();

               

                while(it.hasNext())

                {

                        Student stu = it.next();

                        String addr = hm.get(stu);

                        System.out.println(stu.getName()+":"+stu.getAge()+"...."+addr);        //这里有问题,改了就好了;当然你也可以再Student这个类里面复写toString这个方法

                }


作者: 王大斌    时间: 2013-4-12 07:16
当你不去覆盖toString()方法的时候,使用系统默认的toString()方法
至于输出这个
test.Student@62363cc....beijing
是因为object中toString这样定义的
getClass().getName() + '@' + Integer.toHexString(hashCode())






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