java-collections.sort异常Comparison method violates its general contract!
2016-06-30 17:51
267 查看
异常信息
原因
JDK7中的Collections.Sort方法实现中,如果两个值是相等的,那么compare方法需要返回0,否则 可能 会在排序时抛错,而JDK6是没有这个限制的。
在 JDK7 版本以上,Comparator 要满足自反性,传递性,对称性,不然 Arrays.sort,
Collections.sort 会报 IllegalArgumentException 异常。
说明:
1) 自反性:x,y 的比较结果和 y,x 的比较结果相反。
2) 传递性:x>y,y>z,则 x>z。
3) 对称性:x=y,则 x,z 比较结果和 y,z 比较结果相同。
反例:下例中没有处理相等的情况,实际使用中可能会出现异常:
java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.TimSort.mergeHi(TimSort.java:868) at java.util.TimSort.mergeAt(TimSort.java:485) at java.util.TimSort.mergeCollapse(TimSort.java:408) at java.util.TimSort.sort(TimSort.java:214) at java.util.TimSort.sort(TimSort.java:173) at java.util.Arrays.sort(Arrays.java:659) at java.util.Collections.sort(Collections.java:217) ...
原因
JDK7中的Collections.Sort方法实现中,如果两个值是相等的,那么compare方法需要返回0,否则 可能 会在排序时抛错,而JDK6是没有这个限制的。
if (len2 == 0) { throw new IllegalArgumentException("Comparison method violates its general contract!"); }
在 JDK7 版本以上,Comparator 要满足自反性,传递性,对称性,不然 Arrays.sort,
Collections.sort 会报 IllegalArgumentException 异常。
说明:
1) 自反性:x,y 的比较结果和 y,x 的比较结果相反。
2) 传递性:x>y,y>z,则 x>z。
3) 对称性:x=y,则 x,z 比较结果和 y,z 比较结果相同。
反例:下例中没有处理相等的情况,实际使用中可能会出现异常:
new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return o1.getId() > o2.getId() ? 1 : -1; } }
相关文章推荐
- JRE、JDK和JVM之间的关系
- Spring MVC整理系列(04)————Spring MVC配置解析及整合SprinSpring MVC之@RequestParam @RequestBody @RequestHeader 等详解
- 使用代码块和JAVA程序来接收游标返回数据集合
- java中的final关键字
- 深入理解java虚拟机读书笔记1--java内存区域
- java中关于线程间协作所用关键字synchronized,wait,notify的用法
- 在Eclipse中使用JUnit4进行单元测试(中级篇)
- Java-3
- java实现多线程编程的两种方法。
- java多线程断点下载
- Eclipse无法以Debug模式运行
- Java 21选5 问题
- Java基础数组应用
- java编程相关总结(三)
- org.springframework.beans.factory.BeanDefinitionStoreExcep
- JAVA 读取本地配置文件(2)
- 在Eclipse中使用JUnit4进行单元测试(初级篇)
- java.util.Date和java.util.Calendar及相关类
- java @ResponseBody返回值中去掉NULL字段
- Java并发编程:Callable、Future和FutureTask