jdk 7 IllegalArgumentException: Comparison method violates its general contract
上次出了一个异常
Caused by: java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(TimSort.java:747)
at java.util.TimSort.mergeAt(TimSort.java:483)
at java.util.TimSort.mergeCollapse(TimSort.java:410)
at java.util.TimSort.sort(TimSort.java:214)
at java.util.TimSort.sort(TimSort.java:173)
原因就是Collections.sort()函数 经过设置
java.util.Arrays.useLegacyMergeSort=true 异常消失了
可现在想知道在jdk7下 为什么会出现这个问题 谁可以写个demo 复现这个异常吗
这是我做的test list有相同的引用 而且我都返回1 但没有抛任何异常
--------------------编程问答-------------------- 汗。不知道楼主现在想要做什么呀?
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Data {
public Data(int id,String name){
this.id = id;
this.name = name;
}
@Override
public String toString(){
return this.id + "->" + this.name;
}
public int id ;
public String name;
}
public class test {
public static void main(String[] args) {
Data d1 = new Data(1,"a");
Data d2 = new Data(2,"5");
Data d3 = new Data(3,"u");
Data d4 = new Data(4,"p");
Data d5 = new Data(1,"b");
List<Data> datas = new ArrayList<Data>();
datas.add(d1);
datas.add(d2);
datas.add(d3);
datas.add(d4);
datas.add(d5);
datas.add(d1);
for (int i = 0; i< 39; ++i){
datas.add(d1);
}
Collections.sort(datas,new Comparator<Data>(){
@Override
public int compare(Data o1, Data o2) {
return 1;
}
});
System.out.println(datas);
}
}
1.6上面的代码,没有错误的。
1.7身边没装。 帮顶吧。 --------------------编程问答-------------------- 想找一个在1.7上调用Collections.sort能抛Caused by: java.lang.IllegalArgumentException的例子
这个代码在1.7下也运行正确 --------------------编程问答-------------------- 没装jdk1.7
帮忙顶下 --------------------编程问答-------------------- 好像jdk7的TimSort算法,不支持空的排序!!
你这麽改写一下就会出错了!!
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Data {
public Data(Integer id,String name){
this.id = id;
this.name = name;
}
@Override
public String toString(){
return this.id + "->" + this.name;
}
public Integer id ;
public String name;
}
public class test {
public static void main(String[] args) {
Data d1 = new Data(1,"a");
Data d2 = new Data(2,"5");
Data d3 = new Data(3,"u");
Data d4 = new Data(4,"p");
Data d5 = new Data(1,"b");
Data d6 = new Data(null,"b");
List<Data> datas = new ArrayList<Data>();
datas.add(d6);
datas.add(d1);
datas.add(d2);
datas.add(d3);
datas.add(d4);
datas.add(d6);
datas.add(d5);
datas.add(d1);
datas.add(d6);
for (int i = 0; i< 39; ++i){
datas.add(d1);
}
datas.add(d6);
Collections.sort(datas,new Comparator<Data>(){
@Override
// 按执行顺序号排序
public int compare(Data o1, Data o2) {
if (o1.id == null)return 1;
if (o2.id == null)return -1;
return o1.id.compareTo(o2.id);
}
});
System.out.println(datas);
}
}
补充:Java , Java SE