JDK1.7与JDK1.6当中Collections的TimSort排序的不兼容复现
jdk1.7报错java.lang.IllegalArgumentException: Comparison method violates its general contract!
由于本人在复现这个问题的时候找了好久,故在这里记录下来这个问题,以便其他朋友们直接发现问题所在。想看TimSort算法(JDK1.7的排序算法),可以参考https://blog.csdn.net/yangzhongblog/article/details/8184707
首先废话不多说,直接先上代码:
import java.util.*;
public class HelloWorld {
public static void main(String[] args) throws Exception {
List<Map<String, Object>> listMap = new ArrayList<Map<String, Object>>();
Long[] a = {
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
};
for(int i=0; i<a.length; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("time", a[i]);
listMap.add(map);
}
//System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
Collections.sort(listMap, new Comparator<Map<String, Object>>() {
@Override
public int compare(Map<String, Object> o1, Map<String, Object> o2) {
Long time1 = Long.parseLong(o1.get("time").toString());
Long time2 = Long.parseLong(o2.get("time").toString());
/*return time1 >= time2 ? 0 : (time1 > time2 ? 1 : -1);*/
if (time1 >= time2) {
return 1;
} else {
return -1;
}
}
});
}
}
这段代码如果在jdk1.6的版本下进行测试,是不会有任何问题的。如下图:
但是如果我们使用jdk1.7的版本进行编译执行,如下图所示:
个人觉得这应该是jdk1.7的Bug,毕竟1.6的jdk并没有出现问题。而且如果你将上面的数组数据设置少一些的话,那么这个错误也并不会出现,如下图所示:
代码为:
所以我觉得应该是jdk的Bug。
解决方案就是不使用JDK1.7的排序,代码就是在排序之前添加如下代码:
System.setProperty(“java.util.Arrays.useLegacyMergeSort”, “true”);
学习、成长