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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ぺsimon☆ 中级黑马   /  2013-4-26 15:42  /  2561 人查看  /  10 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ぺsimon☆ 于 2013-4-28 17:42 编辑
  1. /*
  2. 需求:把学生和其所属户籍存到HashMap集合中
  3. 因为学生不唯一的,户籍可以相同,所以在HashMap中以学生为键,户籍为值

  4. 学生类中,姓名和年龄相同视为一个学生

  5. */
  6. import java.util.*;
  7. class Student implements Comparable<Student>//实现Comparable比较器
  8. {
  9.         private String name;
  10.         private int age;
  11.         Student(String name,int age) //构造函数
  12.         {
  13.         this.name=name;
  14.         this.age=age;
  15.         }

  16.         public void setName(String name) //设置名字
  17.         {
  18.         this.name=name;
  19.         }

  20.         public String getName() //获取获取名字
  21.         {
  22.         return name;
  23.         }

  24.         public void setAge(int age)//设置年龄
  25.         {
  26.         this.age=age;
  27.         }

  28.         public int getAge()//获取年龄
  29.         {
  30.         return age;
  31.         }

  32.         public int compareTo(Student obj) //覆盖compareTo方法
  33.         {
  34.         if(!(obj instanceof Student))
  35.         throw new RuntimeException();
  36.         Student s=(Student)obj;
  37.         int num=new Integer(this.age).compareTo(new Integer(s.age));
  38.         if(num==0)
  39.         return this.name.compareTo(s.name);
  40.         return num;
  41.         }

  42.         public int hashCode() //覆盖hashCode方法
  43.         {
  44.         return name.hashCode()+age*6;
  45.         }

  46.         public boolean equals(Student obj) //覆盖equals方法
  47.         {
  48.         if(!(obj instanceof Student))
  49.         return false;
  50.         Student s=(Student)obj;
  51.         return this.name.equals(s.name)&&this.age==s.age;
  52.         }

  53. //***覆盖toString方法 ,这里不懂...为什么把toString()方法覆盖之后,程序打印

  54. 的Student对象是:name+":"+age ,不覆盖toSring方法打印出来的Student是一个地

  55. 址值,而这个地址值又是怎么来的呢?
  56.         public String toString()
  57.         {
  58.         return name+":"+age;
  59.         }
  60. }


  61. class HashMapStudent
  62. {
  63.         public static void main(String[] args)
  64.         {
  65.         //创建一个容器
  66.         HashMap<Student,String> hs=new HashMap<Student,String>();
  67.         hs.put(new Student("zhangsan",01),"guangzhou01");
  68.         hs.put(new Student("zhangsan",02),"guangzhou02");
  69.         hs.put(new Student("zhangsan",03),"guangzhou03");
  70.         hs.put(new Student("zhangsan",04),"guangzhou04");
  71.         hs.put(new Student("zhangsan",05),"guangzhou05");
  72.         //得到映射关系
  73.         Set<Map.Entry<Student,String>> s=hs.entrySet();
  74.         //得到迭代器
  75.         Iterator<Map.Entry<Student,String>> it=s.iterator();
  76.         //循环输出每一个键值对
  77.         while(it.hasNext())
  78.         {
  79.         Map.Entry<Student,String> me=it.next();
  80.         System.out.println(me.getKey()+"="+me.getValue());
  81.         }
  82.         /*
  83.         Set<Student> s=hs.keySet();
  84.         Iterator<Student> it=s.iterator();
  85.         while(it.hasNext())
  86.         {
  87.         Student s1=it.next();
  88.         String s2=hs.get(s1);
  89.         System.out.println(s1+"="+s2);
  90.         
  91.         }
  92.         */
  93.         }
  94. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

10 个回复

倒序浏览
1.toString()方法是Object中的方法,如果不覆盖,返回结果默认就是“类名@地址值”,
public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
2.如果覆盖了,函数体就不一样了,那当然就按照你自己定义的返回值了,Object中的toString方法不也如此吗,希望这个分析对你有用

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
楼上正解。路过```赚金币。
回复 使用道具 举报

楼上正解。路过```赚金币。
回复 使用道具 举报
搞明白打印流的原理即可
请参考这个帖:http://bbs.itheima.com/forum.php?mod=viewthread&tid=46122
回复 使用道具 举报
1、建议楼主查看下API文档,toString()方法,是所有普通类从Object中继承的方法,默认的功能是:Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())
2、我们写自己的类时,可以复写toString()方法,是为了让该方法能按照我们的意愿返回一个值。楼主所举出的例子程序中,覆盖toString()方法是为了让结果更有意义,可以看得更直白。试想,让你输出人的信息,你该不会给人家输出一段看不懂的hashcode值吧? 但对于学习视频中的你来说,你应该是想问这个程序一定要这样写吗,为什么……答案是:否!这里你完全可以不用覆盖toString()方法。这是随你自愿的,你想要直接打印Student对象时输出的是什么内容,就可以通过重写toString()来完成。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
楼上正解,都是正解
回复 使用道具 举报
如果不覆盖toString()方法,默认会调用Object类中的toString()方法,你可以查看一下API文档,在java.lang包中找到Object 其toString方法是这样定义的:

    public String toString() 返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂。建议所有子类都重写此方法。
    Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())
  

返回:该对象的字符串表示形式。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
toString()方法默认的是继承的Object父类的toString()方法。
而Object类的toString()方法,返回 的是
调用对象的.class文件的名字+@+改对象hashcode的无符号十六进制表示。
即是,this.getClass().getName()+"@"+Integer.toHexString(this.hashcode());
而System.out.println().在打印的时候会调用toString()方法。以字符串的形式输出。
而如果想要实现特有的数据输出的方式,则需要重写toString()方法。
public String toString(){
           return   .....;
}
回复 使用道具 举报
hmr8 中级黑马 2013-4-27 02:04:02
10#
object是根类,所有类都直接或间接继承Object类中的toString
回复 使用道具 举报
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马