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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© JinnyZh 中级黑马   /  2013-5-17 00:29  /  1148 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 JinnyZh 于 2013-5-17 22:41 编辑

import java.util.Map;
import java.util.TreeMap;

public class TreeMapDemo {
       public static void main(String[] args) {
              Map<Student, Integer> map = new TreeMap<>();
                map.put(new Student(2,"JinnyNg"), 77);
                map.put(new Student(1,"JinnyZh"), 33);
                map.put(new Student(4,"Jade"), 55);
                map.put(new Student(6,"Jinny"), 66);
                map.put(new Student(5,"Jolin"), 78);
                map.put(new Student(3,"JinnyNg"), 90);
                map.put(new Student(3,"JinnyNg"), 88);
                System.out.println(map);
        }
}
//
class Student implements Comparable<Student> {
        private int num;
        private String name;

        public int getNum() {
                return num;
        }

        public void setNum(int num) {
                this.num = num;
        }

        public String getName() {
                return name;
        }

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

        // 创建构造函数
        public Student() {
                super();
                // TODO Auto-generated constructor stub
        }

        public Student(int num, String name) {
                super();
                this.num = num;
                this.name = name;
        }

        // 重写toString方法
        @Override
        public String toString() {
                // 按照学号的顺序
                return "学号" + num + "-" + name;
        }

        @Override
        public int compareTo(Student o) {
                // TODO Auto-generated method stub
                return this.num - o.num;
        }

}


不知道代码有没有复制错误,在HashMap中需要重写hashcode 和equals 方法才能去重复
但是在TreeMap中我什么都没写,他还是自动去重复了啊,什么原因?

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

3 个回复

正序浏览
TreeMap集合 底层是 二叉树 数据结构,可以用于给Map集合中的 键 排序。

在这个程序中 你定义的 键 是Student 对象。
map.put(new Student(3,"JinnyNg"), 90);
map.put(new Student(3,"JinnyNg"), 88);
在这里看似new了连个  Student 对象,其时在内存是一个Student对象,
TreeMap 会认为 在底层存储的时候 因为是一样的。
所以在Map中的 键 是相同的,所以后面的 值 会被覆盖。
最终存 的是   Student(3,"JinnyNg"), 88
回复 使用道具 举报
treeset不与许元素重复啊,假如
add("黑马",99);
add("黑",100);你用treeset只能输出黑马 100;因为黑马名字相同只输出一个,但是100会把99覆盖。不能全部输出。当集合出入的是一个对象的时候,并且属性不唯一时,hashset有自己的哈希算法,当前面属性相同时,再去调用esquals方法,可以真的保证元素的唯一性。我今天也是刚学的集合,个人这么认为,如有不妥,请谅解
回复 使用道具 举报
本帖最后由 JinnyZh 于 2013-5-17 00:36 编辑

如果是这样那么去重复是不是用TreeMap写起来更简洁啊, 只需要实现 Comparable接口就行了, 反正hashSet也是无序的...还要重写hashcode  equals
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马