扫码关注官方订阅号
84669人学习
65727人学习
82984人学习
467778人学习
498837人学习
471966人学习
256484人学习
152542人学习
224170人学习
139536人学习
81804人学习
85022人学习
11944人学习
20001人学习
60816人学习
5487人学习
15007人学习
2150人学习
6980人学习
194925人学习
359900人学习
1142人学习
19058人学习
3206人学习
180550人学习
48569人学习
17603人学习
40936人学习
1049人学习
750人学习
32909人学习
上图是《阿里巴巴Java开发手册v1.2.0》中的说明,这里举了个反例,说没有处理相等的情况,但我想:
o1.getId() > o2.getId()
反过来不就是
o1.getId() <= o2.getId()
我平时都是这样用的,求大神在帮忙解释一下这个地方的技巧是什么?是什么原因?
学习是最好的投资!
进一步了解了一下,问题的根本原因是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肯定是不对的,所以一定要单独处理相等的情况。
应该要判断等于0 的情况
经过@gemoji的讨论终于明白了,总结一下:在JDK7以前的版本就像Effective Java里说的那样,Comparator不强制要求实现等于,在JDK7之后的版本由于排序改用了TimSort算法,导致Comparator必须实现等于.
<<Effective Java中文版>>里面有详细的解释,其实这是一个强烈建议,反例这样做其实破坏了equals和比较的传递性和对称性
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
扫描下载App
Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
精品班
技术支持
技术咨询
学习群
会员优惠
返回顶部
进一步了解了一下,问题的根本原因是JDK7的排序实现改为了TimSort,详细见这篇文章。
http://blog.2baxb.me/archives...
一开始回答的时候并没有完全理解作者问问题的意图,回答得有点草率,为此道个歉。
分割线下是之前回答的内容,因为答案评论里有和@wanghaa 就旧有答案的讨论,因此保留,也谢谢@wanghaa 让我意识到问题。
上面的代码会输出-1,进行比较的两个取值相等的情况下应该返回0,返回-1肯定是不对的,所以一定要单独处理相等的情况。
应该要判断等于0 的情况
经过@gemoji的讨论终于明白了,总结一下:
在JDK7以前的版本就像Effective Java里说的那样,Comparator不强制要求实现等于,
在JDK7之后的版本由于排序改用了TimSort算法,导致Comparator必须实现等于.
<<Effective Java中文版>>里面有详细的解释,其实这是一个强烈建议,反例这样做其实破坏了equals和比较的传递性
和对称性