【问题标题】:Arrays.sort(object[]) is not throwing classcastexceptionArrays.sort(object[]) 没有抛出 classcastexception
【发布时间】:2013-03-16 14:22:38
【问题描述】:

代码:

public class CompareTest {

    public static void main(String[] args) {

        ArrayList list =  new ArrayList();
        (list).add(new CompareTest());  


        Arrays.sort(list.toArray()); //Does not throw Exception , why ?
        Collections.sort(list);   //throws ClassCastException
    }

}

根据 Java 文档: Arrays#sort

将指定的对象数组按升序排序,根据 其元素的自然排序。 数组中的所有元素必须 实现 Comparable 接口

为什么 Arrays#sort 不抛出 ClassCastException 如 JavaDoc 所述?

【问题讨论】:

    标签: java arrays sorting classcastexception comparable


    【解决方案1】:

    因为Arrays.sort()的源码有这个快捷键:

        int nRemaining  = hi - lo;
        if (nRemaining < 2)
            return;  // Arrays of size 0 and 1 are always sorted
    

    所以它不需要检查数组的元素是否实现了 Comparable,因为它不必对只有一个元素的数组进行排序。

    请注意,javadoc 不保证会引发 ClassCastException。

    【讨论】:

    • 有趣 - Java 7 中的 TreeMap 中“修复”了同样的问题,但数组中显然没有……
    • 所以 javadoc 可能是骗人的。
    【解决方案2】:

    因为它只有一个元素...如果元素少于 2,Array.sort() 将不排序而结束

    【讨论】:

      【解决方案3】:

      原因是list只有一个元素,Arrays.sort中从未调用compareTo方法,因此该元素永远不会转换为Comparable。

      但无论如何都会在 Collections.sort 中调用它:

      public static <T extends Comparable<? super T>> void sort(List<T> list) {
      Object[] a = list.toArray();
      Arrays.sort(a);
      ListIterator<T> i = list.listIterator();
      for (int j=0; j<a.length; j++) {
          i.next();
          i.set((T)a[j]);
      }
      }
      

      所有元素都转换为从 Comparable 扩展的 T

      【讨论】:

        猜你喜欢
        • 2015-08-10
        • 1970-01-01
        • 1970-01-01
        • 2015-11-02
        • 2013-04-13
        • 2017-10-10
        • 2014-03-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多