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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 盛亚昆 中级黑马   /  2012-3-20 15:03  /  1697 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.*;
class Student implements Comparable<Student>//2实现Comparable接口,让对象具有比较性,类型是Student
{
        private String name;//1 描述学生,进行set,get方法
        private int age;
        Student(String name,int age)
        {
                this.name=name;
                this.age=age;
       
        }
        public void setName(String name)
        {
                this.name=name;
        }
        public void setAge(int age)
        {
                this.age=age;
       
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
        public int compareTo(Student s)//调用接口中比较方法
        {
                int num=new Integer(this.age).compareTo(new Integer (s.age));
                if(num==0)
                        return this.name.compareTo(s.name);
                return num;
        }
        public int hashCode()//3 复写hashcode方法,确定位置
        {
                return name.hashCode()+age*20;//返回名字的哈希值

        }
        public boolean equals(Object obj)
        {
                if (!(obj instanceof Student))
                        throw new ClassCastException("类型不匹配");//一定要抛出这种错误吗?????
                Student s=(Student)obj;//这里还运用了转型 ,怎么不能应用泛型啊????

                return this.name.equals(s.name)&&this.age==s.age;
       
       
        }

}




class MapTest
{
        public static void main(String[] args)
        {
                HashMap<Student,String> hm = new HashMap<Student,String>();//建立集合
                hm.put(new Student("lisi1",21),"beijing");//添加元素,student定义为key,地址为value,为什么要这么设定那??????
                hm.put(new Student("lisi2",22),"jing");
                hm.put(new Student("lisi3",23),"bei");
                hm.put(new Student("lisi4",24),"beng");
                        //第一种取出方式KeySet
                        Set<Student>keySet=hm.keySet();//子类获取Set父类的方法
                       
                        Iterator<Student> it=keySet.iterator();//获取迭代器

                        while (it.hasNext())
                        {
                                Student stu =it.next();//返回是student类型的。用stu记录
                                String addr=hm.get(stu);//value=get(key)
                                System.out.println(stu+"***"+addr);
                        }



                System.out.println("Hello World!");
        }
}
打印怎么出错了呢????
Student@62363cc***bei
Student@62363a2***beijing
Student@62363e1***beng
Student@62363b7***jing
Hello World!
怎么都是哈希值啊,求解啊

5 个回复

倒序浏览
System.out.println(stu+"***"+addr);这句输出的时候是输出一个对象和addr的一个字符串,所以前面的肯定是对象的哈希值了,自定义一个输出方法或者使用get方法来获得学生的名字和年龄
回复 使用道具 举报
因为没有重写 toString()方法, 默认调用的是 Object类中的toString()方法,
返回这值为 : getClass().getName() + '@' + Integer.toHexString(hashCode())
也就出现了上面的输出结果:   Student@62363cc

此处只要重写Student类中的toString() 方法即可 :
public String toString(){
  return this.name+"::::"+this.age;
}
回复 使用道具 举报
java中一切都是对象
System.out.println(); 括号里输出的是对象的toString()方法
System.out.println(stu+"***"+addr); 中 stu是一个对象所以你打印的是一个对象。
你没有重写Student对象的toString() 方法 那没使用就是他的父类Object的toString()的方法
这是Object的toString()方法
public String toString()返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

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

返回:
该对象的字符串表示形式。
回复 使用道具 举报
如果不重写toString 还有别的方法吗?
回复 使用道具 举报
不重写toString  也可以
     Iterator<Student> it=keySet.iterator();//获取迭代器

                        while (it.hasNext())
                        {
                                Student stu =it.next();//返回是student类型的。用stu记录
                                String addr=hm.get(stu);//value=get(key)
                                System.out.println(stu+"***"+addr);  
          把这句输出语句换成    System.out.println("student(name,age)=("+stu.getName()+","+stu.getAge+")*********"+addr);
   意思是让存入集合中的对象,也就是对象的引用(地址)直接调用对应对象的getName 和getAge方法  这样就不用重写toString方法了
                        }






  
public boolean equals(Object obj)
        {
                if (!(obj instanceof Student))
                        throw new ClassCastException("类型不匹配");//一定要抛出这种错误吗?????  这不抛也可以,也个return语句  抛的话就是让程序停止执行了,因为                                                                                       执行下去也没有意义了,根本就比较不了了,这样写程序比较严谨。
                Student s=(Student)obj;//这里还运用了转型 ,怎么不能应用泛型啊????
                   这向下转型是因为这个类要重写 Object类中的equals方法,而你传进来的是Object obj = new Student("lisi","01");学生对象,所以必须转型

                return this.name.equals(s.name)&&this.age==s.age;
        
        
        }

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马