黑马程序员技术交流社区

标题: 请教大神一个关于二叉树存储元素的问题 [打印本页]

作者: Nemo    时间: 2015-6-24 15:57
标题: 请教大神一个关于二叉树存储元素的问题
我们都知道如果想向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也能确定就是只有一个元素
求大神指点。。。。。

作者: liu100chao    时间: 2015-6-24 18:37
你打印了两次??
作者: Nemo    时间: 2015-6-24 20:54
liu100chao 发表于 2015-6-24 18:37
你打印了两次??

恩恩,你试试
作者: Foundmoon    时间: 2015-6-24 21:23
应该是每次都调用compare方法的,而且是将要加入的新元素,调用自己的方法,而老元素作为参数
作者: Nemo    时间: 2015-6-24 21:33
Foundmoon 发表于 2015-6-24 21:23
应该是每次都调用compare方法的,而且是将要加入的新元素,调用自己的方法,而老元素作为参数 ...

我的意思是,我只向其中添加一个元素,那么还会调用compare方法吗?事实证明还是会调用,而且是元素自己跟自己比较了两次,我不知道是为什么
作者: Nemo    时间: 2015-6-24 21:35
如果只添加一个元素也要调用compare方法的话,那么为什么当我们只向其中添加一个元素时,元素所在类是可以不实现Comparable接口的呢?可以不实现的意思不就应该是没调用比较方法吗
作者: liming_heima    时间: 2015-6-24 21:51
暂时还没有接触到二叉树。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2