这个坑,你要注意:Comparison method violates its general contract!

在从JDK6升级到JDK7后,自定义的double类型金额排序出现错误:Comparison method violates its general contract。错误原因是JDK7的排序算法更改,对Comparable接口的实现更加严格。解决办法包括修改代码或通过JVM启动参数恢复JDK6的排序算法。
摘要由CSDN通过智能技术生成

背景

有部分业务需要进行排序,对比的对象是某实体里的金额(double 类型),这样,我们实现了自定义的比较类,结果运行一段时间之后报了错误:Comparison method violates its general contract! ,经过校验,发现错误出现在自定义排序上,经网上各种查阅资料发现是jdk7的兼容问题,以下将解决过程分享给大家。

错误截图:




重写的比较方法:

解决方案

先说如何解决,解决方式有两种。

修改代码

上面代码写的本身就有问题,第4行没有考虑o1 == o2的情况,再者说我们不需要自己去比较,修改为如下代码即可:

/**
	 * 对比类:根据持有金额
	 */
	private static class  TenderCollectComparator implements Comparator<TenderCollect> {

		public int compare(TenderCollect b1, TenderCollect b2) {

			return b1.getTocollectmoney().compareTo(b2.getTocollectmoney());
		}
	}



不修改代码

那么问题来了。为什么上面代码在JDK6中运行无问题,而在JDK7中却会抛异常呢?这是因为JDK7底层的排序算法换了,如果要继续使用JDK6的排序算法,可以在JVM的启动参数中加入如下参数:

[plain] view plain copy prin
  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值