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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈莹 中级黑马   /  2012-9-2 13:11  /  1642 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class MyComparator implements Comparator<Student>
{
        public int compare(Student s1,Student s2)
        {
                System.out.println(s1.getName()+"与"+s2.getName()+"比较:");
                int num = s1.getName().compareTo(s2.getName());
                if(num==0)
                {
                        return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
                }
                return num;
        }
}

public class MapTest2
{
        public static void main(String args[])
        {
                TreeMap<Student,String> tm = new TreeMap<Student,String>(new MyComparator());

                tm.put(new Student("张三",23),"北京");
                tm.put(new Student("钱七",20),"天津");
                tm.put(new Student("钱七",25),"天津");
                tm.put(new Student("李四",21),"上海");
                tm.put(new Student("阿里",25),"深圳");
                tm.put(new Student("丁一",25),"深圳");
                tm.put(new Student("张三",23),"北京");
                Set<Map.Entry<Student,String>> entrymap= tm.entrySet();
                Iterator<Map.Entry<Student,String>> it = entrymap.iterator();

                while(it.hasNext())
                {
                        Map.Entry<Student,String> me = it.next();
                        Student stu = me.getKey();
                        String address = me.getValue();
                        sop(stu+"--->"+address);
                }
        }

        public static void sop(Object o)
        {
                System.out.println(o);
        }
}
程序运行的结果是:
钱七与张三比较:
钱七与张三比较:
钱七与钱七比较:
李四与钱七比较:
李四与张三比较:
阿里与钱七比较:
阿里与钱七比较:
丁一与钱七比较:
丁一与张三比较:
张三与钱七比较:
张三与张三比较:
丁一            25--->深圳
张三            23--->北京
李四            21--->上海
钱七            20--->天津
钱七            25--->天津
阿里            25--->深圳
我的问题是:
为什么向TreeMap中添加数据时,不是跟每一个已经存在的数据进行比较,比如存入阿里,为什么阿里只跟钱七比较了,而没跟张三比较?这里面有什么规律吗?

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
这个问题我也曾经疑惑过。后来记得视频里面 毕老师说过, 因为在TreeMap里面底层比较的时候采用了优化的比较方法
比如当元素比较多的时候TreeMap(底层数据结构是二叉树)并不一定从树根开始遍历比较了,有可能就从二叉树中间的某个结点开始遍历比较了。不管怎么比较,最后一定会保证元素是有序的。
当时我看这一天视频的时候,时间紧也没来得及深究这个问题。所以说这TreeMap里面到底采用的是什么优化的比较算法,我也不太清楚。我会持续关注你这个帖子,看看有没高手知道。
回复 使用道具 举报



你可以看下这张图,这张图如果说 钱七是22,张三是20,那么阿里过来就直接跟22(钱七)比,就不会跟20(张三)比。
这是二叉树的内在实现的,不需要我们自己去实现,就跟List集合是可以重复的一样,因为它有索引而Set集合就不行,因为它没有索引,

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