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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵学刚 中级黑马   /  2012-12-4 20:52  /  1783 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 赵学刚 于 2012-12-5 00:42 编辑

        问题:测试类并没有调用toString ,为什么会自动起到转换效果呢?谁能解析下测试类MapTest调用toString的过程。。。。。谢谢!!!
  1. public class Student implements Comparable<Student> {
  2.         private String name;
  3.         private int age;
  4.         private String address;
  5.         public String toString(){
  6.                 return  this.age+this.name;
  7.         }
  8.     Student (String name  ,int age){
  9.             this.age=age;
  10.             this.name=name;
  11.     }
  12.         public String getName() {
  13.                 return name;
  14.         }

  15.         public void setName(String name) {
  16.                 this.name = name;

  17.         }

  18.         public int getAge() {
  19.                 return age;
  20.         }

  21.         public void setAge(int age) {
  22.                 this.age = age;
  23.         }

  24.         public String getAddress() {
  25.                 return address;
  26.         }

  27.         public void setAddress(String address) {
  28.                 this.address = address;
  29.         }
  30.           //自定义哈希值指定集合元素存储到哈希表中
  31.      public int hashCode(){
  32.              return name.hashCode()+age*32;
  33.                              
  34.      }
  35.       //自定义比较方法
  36.      public  boolean equals(Object obj){
  37.                if(!(obj instanceof Student))
  38.                        throw new ClassCastException("类型不匹配");
  39.                    Student s=(Student)obj;
  40.                  return  this.name.equals(s.name)&&this.age==s.age;
  41.      }
  42.         @Override //当集合按二叉树存储时,可以按自然顺序排序
  43.         public int  compareTo(Student s) {
  44.          int num=new Integer(this.age).compareTo(new Integer(s.age));
  45.          if(num==0){
  46.                  return this.name.compareTo(s.name);
  47.          }
  48.                 return num;
  49.         }
  50. public class MapTest {

  51.         /**
  52.          * 需求:取出所有map元素
  53.          */
  54.         public static void main(String[] args) {
  55.                 Map<Student,String> map=new TreeMap<Student,String>();
  56.                      map.put(new Student("lisi1",123), "tianjingo");
  57.                      map.put(new Student("lisi2",12), "tianjingo");
  58.                      map.put(new Student("lisi3",121), "tianjingo");
  59.                      map.put(new Student("lisi2",127), "tianjingo");
  60.                         Set<Map.Entry<Student,String>> keySet=map.entrySet();
  61.                         Iterator<Map.Entry<Student,String>> it=keySet.iterator();
  62.                         while(it.hasNext()){
  63.                                 
  64.                                 Map.Entry<Student,String> me=it.next();
  65.                                 Student key=me.getKey();
  66.                                 String value=me.getValue();
  67.                                 System.out.println(key+"==="+value);
  68.                                 
  69.                         }

  70.         }

  71. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

5 个回复

正序浏览
在eclipse中你你可以找到覆写toString方法选项,就能看到 它默认的方法,这个是Object的方法,是用来打印结果的时候显示的,一般就是名字@hashcode码
回复 使用道具 举报
哦  了解   谢谢
回复 使用道具 举报
你明明是调用了toString方法的
你的程序74行"System.out.println(key+"==="+value);",这里调用了key和value的toString方法
在打印语句System.out.println();如果是对象的话,默认调用对象的toString.
你可以看PrintStream的println(Object x)方法,它打印String中的valueOf(Object x),而String中的valueOf(Object x)方法返回值就是x.toSting();所以在打印流System.out的println()方法中写个对象就是打印对象的toString方法.
而你程序中TreeMap存的key和value都是对象,并且你在第5行重写了key(即Student对象)的toString
回复 使用道具 举报
本帖最后由 xjandrew 于 2012-12-4 22:35 编辑

System.out.println 会自动调用Student里面参数的toString()方法.
如果子类中没有toString()方法,它就会调用其父类(Object )的toString()方法

而Object 类的 toString 方法是返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它值等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())

你在主函数中加两句做个测试
Student s = new Student("zhangsan",122);
System.out.println(s);

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
混个分数下载东西!!

点评

不要抱有混的态度上来 。  发表于 2012-12-4 22:00
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马