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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我们都知道如果想向TreeSet或者TreeMap中存入多个自定义对象时,如果该自定义对象不具有可比性,
那么是会报错的,因此我们需要让对象实现Comparable接口,复写compareTo方法,但是我们也发现
那个错误时发生在第二次插入元素时,而不是第一次,这是否意味着第一次添加元素时是不会调用对象
的compareTo方法的,也不在乎对象是否具有可比性的呢?因为此时二叉树中不存在其他元素,所以
这种现象也是可以理解的,既然没有其他元素,那么就不需要比较,这也是我原本的想法,直到我学到
Map的时候无意发现的一个问题,如下:
  1. Map<Student,String> map=new TreeMap<Student,String>(new MyComp());
  2.                 map.put(new Student("abb",22),"北京");
复制代码

该代码只添加了一个元素到TreeMap中,我在比较器的compare方法中打印了两个比较的对象主要用于
观察调用了几次compare方法,运行图如下:


我们可以看到打印了两次:姓名:abb      年龄:22........姓名:abb      年龄:22..........0
这就代表着调用了两次compare方法,这是我不能理解的,而且根据观察发现,两次
都是那唯一的一个元素自己跟自己的比较
而且最后遍历TreeMap也能确定就是只有一个元素
求大神指点。。。。。

6 个回复

正序浏览
暂时还没有接触到二叉树。
回复 使用道具 举报
如果只添加一个元素也要调用compare方法的话,那么为什么当我们只向其中添加一个元素时,元素所在类是可以不实现Comparable接口的呢?可以不实现的意思不就应该是没调用比较方法吗
回复 使用道具 举报
Foundmoon 发表于 2015-6-24 21:23
应该是每次都调用compare方法的,而且是将要加入的新元素,调用自己的方法,而老元素作为参数 ...

我的意思是,我只向其中添加一个元素,那么还会调用compare方法吗?事实证明还是会调用,而且是元素自己跟自己比较了两次,我不知道是为什么
回复 使用道具 举报
应该是每次都调用compare方法的,而且是将要加入的新元素,调用自己的方法,而老元素作为参数
回复 使用道具 举报
liu100chao 发表于 2015-6-24 18:37
你打印了两次??

恩恩,你试试
回复 使用道具 举报
你打印了两次??
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马