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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐长智 中级黑马   /  2013-3-2 00:45  /  1974 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看了集合的视频,在TreeSet集合中。元素如果实现了Comparble接口,并且覆写了compareTo()方法,就能添加到集合中,当元素自身不具备比较性,或者具备的比较性不是所需要的,这时需要让容器自身具备比较性。
定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数,这样在添加对象时,就能自动进行比较。

问题是,为什么当两种排序都存在时,以集合构造函数中传入的比较器为主,原理是什么呢?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

7 个回复

倒序浏览
源码里能得到答案
回复 使用道具 举报
举个例子: 你去买火车票,你不给卖票的说要什么铺位的话,他就默认给你打一张票,选着哪个是哪个
你要是指定了要下铺,那他就按你给他说的打票

也就是说   你不指定,按默认的来   你指定了  就按你指定的来

实在想研究的话,去看看源代码,

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
对,要看内码原理。

if(有Comparator)
   用Comparator;
else if(元素实现了comparable接口)
   用compareTo方法
elseif(元素本身可比较)
   自然排序
ellse
   按集合默认存放

这有个从高到低的等级   

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
楼主问这个问题是想么末倒置吗,通过使容器具有比较性就是为了弥补元素具有比较性的不足,如果一个元素对象,你无法拿到对应的类的源代码,从而修改其源码,甚至你想自己写一个类来继承他然后覆写里面的compareTo()方法都不可能,当该类被final修饰时,这个类就是最终类,像String,此时你只有考虑使用容器的比较性了,所以说容器的比较性相对于元素自身的比较性更加优先考虑

评分

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

查看全部评分

回复 使用道具 举报
如果自然比较都能满足了要求,那你何必再把比较器传进入?
如果自然比较都不满足了要求,你把比较出传进去,却还是用自身比较方法,那这又是做什么?不觉得这样好疯狂?
回复 使用道具 举报
谢洋 高级黑马 2013-3-11 15:05:42
7#
李志卫 发表于 2013-3-2 02:22
对,要看内码原理。

if(有Comparator)

对,要看内码原理。

if(有Comparator)
   用Comparator;
else if(元素实现了comparable接口)//实现了comparable也就是说元素本身可比较了
   用compareTo方法
elseif(元素本身可比较)//与上面重复了
   自然排序
ellse
   按集合默认存放

这有个从高到低的等级   

另外补充:String 及Integer本身已经实现comparable,这点可以看API,int 型能排序,是因为被自动装箱成Integer型再操作

评分

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

查看全部评分

回复 使用道具 举报
猫腻 高级黑马 2013-3-13 10:10:37
8#
如果仍有问题,可以继续追问;若没有问题了,请及时将帖子分类改成【已解决】~

http://bbs.itheima.com/thread-37643-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马