Comparison method violates its general contract 出现原因和解决方法
- 错误如下:
- 代码如下:
刚开始运行,没有什么问题,当我数据量一大的时候,就开时抛出异常,然后一点点拆解,我发现
当nums1和nums2如下时,即list存在太多相同的数组就会抛出这个异常。
int[]nums1 = {-1,-1,0,0,1,1};int[] nums2 ={-1,-1,0,0,1,1};
- 改进后的代码
当两个元素相等时,返回0即可。 但问题又来了,前面我有一些数据比较也是相等的,并没有报这个异常,然后就去百度,查资料。
解释如下:
在 JDK7 版本以上,Comparator 要满足自反性,传递性,对称性,不然 Arrays.sort,Collections.sort
会报 IllegalArgumentException 异常。
自反性:当 两个相同的元素相比时,compare必须返回0,也就是compare(o1, o1) = 0;
反对称性:如果compare(o1,o2) = 1,则compare(o2, o1)必须返回符号相反的值也就是 -1;
传递性:如果 a>b, b>c, 则 a必然大于c。也就是compare(a,b)>0, compare(b,c)>0,
则compare(a,c)>0
回到上面的例子,当ab 时,我返回的是-1,假设返回-1是a>b, 当 bc时 返回的也是 -1 即b>c,
当c==a时,返回的也是 -1 ,这个时候底层在调用TimSort中mergeHi()进行数据合并是就会出现这样的问题,从而抛出异常。
所以在使用Comparator 接口的比较方法时,一定要规范返回值。
Comparison method violates its general contract 出现原因和解决方法相关推荐
- Collections.sort()排序使用TimSort排序报Comparison method violates its general contract 原因
前段时间升级JDK后,之前的功能报java.lang.IllegalArgumentException: Comparison method violates its general contract ...
- fastjson 序列化问题:Comparison method violates its general contract
fastjson 序列化问题:Comparison method violates its general contract 问题重现 今天在测试接口的时候,调用了Mybatis Plus 分页查询的 ...
- java异常排列方式_java中排序报:Comparison method violates its general contract异常的解决...
前言 上周线上的一段排序的java代码出现了一个Comparison method violates its general contract,在解决这个问题的途中学到了一些知识这里总结分享一下. 异 ...
- 排序问题排查Comparison method violates its general contract!
通过List.sort对元素进行排序,测试阶段没发现,在st测试的时候报了这个错误."Comparison method violates its general contract!&quo ...
- 处理 Comparable接口不严谨导致Comparison method violates its general contract!
本文主旨是记录问题解决过程 出错的日志 Shutting down VM --------- beginning of crash FATAL EXCEPTION: main Process: com ...
- java.lang.IllegalArgumentException: Comparison method violates its general contract
一.简介 本篇文章讨论ArrayList.sort方法报错: java.lang.IllegalArgumentException: Comparison method violates its ge ...
- android java.lang.IllegalArgumentException: Comparison method violates its general contract! 问题
android java.lang.IllegalArgumentException: Comparison method violates its general contract! 问题 jav ...
- Comparison method violates its general contract!
最近项目中有许多地方用到了集合排序,不是自然排序,必须的自己实现排序逻辑了. java提供实现排序接口有两个Comparable与Comparator. 我简单理解: 1.Comparable接口是实 ...
- java异常:Comparison method violates its general contract解决
就在五一放假的前一天凌晨,收到一个测试同学发来的消息,说有个接口访问出现了问题,页面如下: 第二天早上紧急查看了线上日志,发现确实是因为这个告警导致返回问题 通过这条堆栈信息查了一些资料 Compar ...
最新文章
- C语言程序设计 细节总结(第8章 指针)
- 两路虚拟化服务器,服务器虚拟化(二)
- C语言 字符串的读取
- java不可变量有哪些_5.Java变量
- 如何干掉网易云音乐?这儿有个可行性未知的技术方案
- POJ - 2676 Sudoku(dfs)
- C++PrimerCH2
- Spring Boot flyway的启动时机比较早
- chrome jsp 显示不正常_selenium+java谷歌浏览器 网站打开不正常
- oracle迁移数据到mysql
- Android 科大讯飞离线语音识别
- 【STM32】UART串口通信无法通信问题(SSCOM)
- biopython有什么用_Biopython介绍
- 张冬:OpenPOWER CAPI为什么这么快?(一)
- 一些过时的免杀技巧 仅供参考
- gl.glenable()介绍
- 各大高校自曝状态一览 排名不分先后
- 视频教程-python全栈习题课-Python
- 苹果a10处理器_苹果“芯”基建简史:自己掌握不了核心技术 乔布斯也得干着急...
- 安卓如何将数据转到iPhone上?