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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨增坤 金牌黑马   /  2013-7-18 21:05  /  1340 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Person implements Comparable<Person>{
        private String name;
        private int age;


        public Person(String name, int age) {
                super();
                this.name = name;
                this.age = age;
        }


        public String getName() {
                return name;
        }


        public int getAge() {
                return age;
        }
        public String toString(){
                return name+"-"+age;
        }
        public int compareTo(Person o) {
                int num=new Integer(this.age).compareTo(new Integer(o.age));
                if(num==0){
                        return this.name.compareTo(o.name);
                }
                return num;
        }
   public int hashCode(){
           return name.hashCode()+age*30;
   }
        public boolean equals(Object ob) {
                if (!(ob instanceof Person)) {
                        throw new ClassCastException("不是Person对象");
                }
                Person p = (Person) ob;
                return this.name.equals(p.name) && this.age == p.age;
        }
        public static void main(String [] s){
                HashMap<Person,String> map=new HashMap<Person,String>();
                map.put(new Person("zs1",22), "北京");
                map.put(new Person("zs2",23), "上海");
                map.put(new Person("zs3",23), "天津");
                map.put(new Person("zs4",24), "邯郸");
                map.put(new Person("zs4",24), "张家口");
                Set<Person> keys=  map.keySet();
                Iterator<Person> it=keys.iterator();
                while(it.hasNext()){
                        Person p=it.next();
                        System.out.println("键:"+p.toString()+"   值:"+map.get(p));
                }
        }        
}结果:
键:zs3-23   值:天津键:zs4-24   值:张家口键:zs2-23   值:上海键:zs1-22   值:北京
为什么结构的键不排序呢,实现接口 Comparable<Person>不就是为了让Person自身具有比较性吗,hashCode()和equals()方法是为了不能有重复的值,那为什么结果键不具有排序呢。
实现接口 Comparable<Person>的作用??
请各位指教!






评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

10 个回复

倒序浏览
HashMap   底层是哈希表数据结构,你觉得用排序么
回复 使用道具 举报
巩建 发表于 2013-7-18 21:26
HashMap   底层是哈希表数据结构,你觉得用排序么

那实现实现接口 Comparable<Person>的作用??
回复 使用道具 举报
forward 发表于 2013-7-18 22:02
那实现实现接口 Comparable的作用??

这是为了保证键的唯一性
回复 使用道具 举报
我觉得楼主要理解Map集合里比较常用的两个集合HashMap和TreeMap集合。
HashMap集合是通过哈希值来存储的,而TreeMap集合是对象的比较性或者是传入的比较器来排序存储的。对象不具备比较性,如果没有传入比较器,TreeMap就没办法排序,所以Person类要实现Comparable接口。

为什么结构的键不排序呢,实现接口 Comparable<Person>不就是为了让Person自身具有比较性吗,hashCode()和equals()方法是为了不能有重复的值,那为什么结果键不具有排序呢。
对于楼主这个问题是因为你在创建集合的时候创建的是HashMap集合的对象,而不是TreeMap集合,所以才不会排序。

为什么要实现接口 Comparable是因为,我们有可能会创建的是TreeMap集合,也有可能创建HashMap集合,既然有多种可能,那么毕老师在视频上也说过,我们在创建一个类时就就要考虑多种情况。
回复 使用道具 举报
恩  楼上说的对   你实现了Comparable的作用是让Person类自身具备比较性   但是你没有用到Tree系列的集合   所以这个比较器也就没产生作用
回复 使用道具 举报
陈雪琪 发表于 2013-7-18 22:35
我觉得楼主要理解Map集合里比较常用的两个集合HashMap和TreeMap集合。
HashMap集合是通过哈希值来存储的, ...

谢谢,我懂了!
回复 使用道具 举报
谢谢大家的回复,我明白了,!
回复 使用道具 举报
下雨天 发表于 2013-7-18 22:56
恩  楼上说的对   你实现了Comparable的作用是让Person类自身具备比较性   但是你没有用到Tree系列的集合   ...

嗯,懂了,就是预防呗!
回复 使用道具 举报
对的 对的
回复 使用道具 举报
巩建 发表于 2013-7-18 21:26
HashMap   底层是哈希表数据结构,你觉得用排序么

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