上次出了一个异常 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.   

    想找一个在1.7上调用Collections.sort能抛Caused by: java.lang.IllegalArgumentException的例子
    这个代码在1.7下也运行正确
      

  2.   

    好像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);
        }
    }