阿里巴巴Java开发手册——Comparator
问题描述
上图是《阿里巴巴Java开发手册v1.2.0》中的说明,这里举了个反例,说没有处理相等的情况,但我想:
o1.getId() > o2.getId()
反过来不就是
o1.getId() <= o2.getId()
我平时都是这样用的,求大神在帮忙解释一下这个地方的技巧是什么?是什么原因?
问题解答
回答1:进一步了解了一下,问题的根本原因是JDK7的排序实现改为了TimSort,详细见这篇文章。http://blog.2baxb.me/archives...
一开始回答的时候并没有完全理解作者问问题的意图,回答得有点草率,为此道个歉。分割线下是之前回答的内容,因为答案评论里有和@wanghaa 就旧有答案的讨论,因此保留,也谢谢@wanghaa 让我意识到问题。
public static void main(String[] args) { int i = 1; int j = 1; int ret = i > j ? 1 : -1; System.out.println(ret);}
上面的代码会输出-1,进行比较的两个取值相等的情况下应该返回0,返回-1肯定是不对的,所以一定要单独处理相等的情况。
回答2:应该要判断等于0 的情况
回答3:经过@gemoji的讨论终于明白了,总结一下:在JDK7以前的版本就像Effective Java里说的那样,Comparator不强制要求实现等于,在JDK7之后的版本由于排序改用了TimSort算法,导致Comparator必须实现等于.


<<Effective Java中文版>>里面有详细的解释,其实这是一个强烈建议,反例这样做其实破坏了equals和比较的传递性和对称性
相关文章:
1. java - yuicompressor-maven-plugin 合并可用却不压缩, 哪配置不对?2. Android-studio导入.so库问题?3. java - mybatis怎么实现在数据库中有就修改,没有就添加4. mysql - 我用SQL语句 更新 行的时候,发现全部 中文都被清空了,请问怎么解决?5. javascript - 修改表单多选项时和后台同事配合的问题。6. java - 针对MongoDB当前哪个第三方ORM框架更稳定成熟?7. python - 两千万条结构化数据怎么进行数据分析8. logging - Python日志, 时间应该使用UTC时间还是本地时间?9. java - Collections类里的swap函数,源码为什么要新定义一个final的List型变量l指向传入的list?10. javascript - react native在run-android时出现这个错误该怎么解决?大神赐教

网公网安备