`

jdk7中sort内部算法改变

 
阅读更多
在jdk7里sort的算法改变了
以Arrays.sort为例:
public static <T> void sort(T[] a, Comparator<? super T> c) {
        if (LegacyMergeSort.userRequested)
            legacyMergeSort(a, c);
        else
            TimSort.sort(a, c);
    }
LegacyMergeSort.userRequested这个是系统变量
    	 Boolean b = java.security.AccessController.doPrivileged(
                 new sun.security.action.GetBooleanAction("java.util.Arrays.useLegacyMergeSort")).booleanValue();
    	 System.out.println(b);

默认是false,也就是默认为timsort算法。LegacyMergeSort简单的将数组等量二分的方式来递归分组,然后每组用插入排序算法来处理每个分组,然后并归排序。

    /**
     * Old merge sort implementation can be selected (for
     * compatibility with broken comparators) using a system property.
     * Cannot be a static boolean in the enclosing class due to
     * circular dependencies. To be removed in a future release.
     */
    static final class LegacyMergeSort {
        private static final boolean userRequested =
            java.security.AccessController.doPrivileged(
                new sun.security.action.GetBooleanAction(
                    "java.util.Arrays.useLegacyMergeSort")).booleanValue();
    }

注意: Cannot be a static boolean in the enclosing class due to circular dependencies. To be removed in a future release.
timsort的一些改变有:
1.不采用递归的等数量二分分组
2.内部每个分组采用了二分插入排序
3.谁和谁并归有一套规则。

网上的一些网友发现之前版本的代码在jdk7下异常抛出:
public class ReproJava7Exception {
    public static void main(String[] args) {
        int[] sample = new int[]
              {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,1,0,-2,0,0,0,0};
        List<Integer> list = new ArrayList<Integer>();
        for (int i : sample)
            list.add(i);
        // use the native TimSort in JDK 7
        Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                // miss the o1 = o2 case on purpose
                return o1 > o2 ? 1 : -1;
            }
        });
    }
}

解决方法在实现Comparable接口的时候要1,-1,0都要分出来。
引用:
http://www.lifebackup.cn/timsort-java7.html
http://en.wikipedia.org/wiki/Timsort
分享到:
评论

相关推荐

    JDK7中的ForkJoin模式

    JDK 7 中引入的 Fork/Join 模式是一种基于分治策略的并行编程模型,旨在简化在多核处理器环境下实现高效的并行计算。这一模式的核心思想是将复杂的大任务拆分成一系列小任务,然后将这些小任务并行执行,最后再合并...

    jdk-7u7-linux-i586.tar.gz下载

    2. **多路归并排序**:Java 7中的Arrays.sort()方法采用了新的多路归并排序算法,提升了数组排序的性能。 3. **Try-with-resources语句**:这是一种新的异常处理结构,允许开发者在try语句块中声明资源,资源会在...

    jdk1.7.0_80_x86_32.zip

    - **多路归并排序**:JDK7中的`Arrays.sort()`和`Collections.sort()`方法使用了新的多路归并排序算法,提高了排序性能。 - **Fork/Join框架**:用于并行执行任务,提高计算密集型任务的执行效率。 - **元空间**...

    jdk api中文 1.8

    7. **默认方法**:在接口中,JDK 1.8允许定义带有实现的方法,称为默认方法。这使得接口可以扩展功能而不破坏已有实现,比如`Iterable`接口的`forEach`方法。 8. **Nashorn JavaScript引擎**:JDK 1.8内置了Nashorn...

    jdk-7u80-windows-x64.zip

    2. **多路归并排序**:Java 7的`Arrays.sort()`和`Collections.sort()`方法使用了更高效的多路归并排序算法,提高了大规模数据排序的性能。 3. **文件系统API增强**:NIO.2(New I/O 2)引入了`java.nio.file`包,...

    jdk-7u80-windows-x64.exe

    尽管Lambda表达式作为官方特性是在JDK 8中正式引入,但在JDK 7 Update 80中已经可以预览其部分功能。Lambda表达式是一种更简洁的函数表示方式,可以大大简化代码并提高可读性。例如: ```java List&lt;String&gt; list = ...

    jdk-7u13-linux-x64.tar.gz

    以下是一些Java 7中的关键特性: 1. **多路归并排序**:Java 7的`Arrays.sort()`方法支持对数组进行更高效的排序,通过使用多路归并排序算法,大大提升了排序性能。 2. **try-with-resources**:这是一种新的异常...

    jdk1.7免安装版

    JDK1.7,也被称为Java 7,是Oracle公司发布的Java平台的一个重要版本,发布于2011年。这个版本引入了许多新特性、改进和优化,旨在提高开发效率和程序性能。 首先,JDK1.7的一个显著特点是其类型推断(Type ...

    JDK1.7.0_49

    2. **多路归并排序**:在Java 7中,`Arrays.sort()` 方法使用了多路归并排序算法,提高了排序性能,尤其是处理大数据量时。 3. **字符串连接优化**:Java 7对字符串连接操作进行了优化,使用StringBuilder时,如果...

    jdk_ri-7u75-b13-windows-i586-18_dec_2014.zip

    1. **多路归并排序**:在Java 7中,`java.util.Arrays.sort()`方法进行了优化,采用了多路归并排序算法,提高了排序性能,尤其对于大数据量的数组,效果显著。 2. **字符串inswitch**:新增了`switch`语句对字符串...

    jdk1.7 7u80 64位

    1. **钻石操作符**:在Java 7中,编译器可以自动推断出泛型类型的实例化参数,简化了代码,如`List&lt;String&gt; list = new ArrayList();` 2. **字符串in switch语句**:现在可以直接在switch语句中使用字符串,提高了...

    jdk 1.8.chm

    本篇将围绕"jdk 1.8 api"这一主题,深入探讨Java SDK 1.8中的关键知识点,帮助开发者提升效率,实现更高效、更优雅的代码编写。 1. **Lambda表达式** JDK 1.8引入了Lambda表达式,这是对函数式编程的一大迈进。...

    jdk1.7 64位

    3. **多路归并排序**:Java 7的`Arrays.sort()`和`Collections.sort()`方法采用了新的多路归并排序算法,提高了大规模数据排序的效率。 4. **文件系统API增强**:NIO.2引入了更现代的文件系统API,提供了异步I/O...

    JDK1.7 64位官方版

    10. **并行GC的改进**:G1垃圾收集器在Java 7中得到了优化,提供更好的停顿时间预测和整体性能。 JDK1.7的64位版本是为了在64位操作系统上运行Java应用而设计的,它可以利用64位系统的内存优势,处理更大规模的数据...

    Jdk15泛型的实现

    例如,`Collections.sort(List)`就是一个泛型算法,可以对任何实现了`Comparable&lt;T&gt;`接口的列表进行排序。 #### 使用与自定义泛型 在使用泛型类或泛型算法时,理解类型参数的约束至关重要。例如,如果一个泛型类...

    jdk-7u80-macosx-x64.dmg.zip

    2. **多路归并排序**:JDK7在`Arrays.sort()`方法中实现了多路归并排序,提高了数组排序的性能。 3. **try-with-resources**:此特性使得资源管理更加简便,自动关闭在try块中打开的流和其他可关闭的资源。 4. **...

    jdk1.5.0_12源代码

    例如,`java.util.List&lt;T&gt;`接口和`Collections.sort(List)`方法展示了泛型在容器和算法上的应用。 2. **枚举(Enums)**: JDK1.5引入的枚举类型结束了Java中使用常量类来模拟枚举的尴尬局面。枚举可以看作是一种...

    jdk1.7-win7-64位

    - **多路归并排序**:在Java 7中,`Arrays.sort()` 方法得到了优化,采用了多路归并排序算法,提升了大规模数据排序的性能。 - **try-with-resources**:这是一种新的语法结构,可以自动关闭实现了 `AutoCloseable...

    很全 jdk_api_1.8_ 谷歌翻译

    7. **Date与Time API**:JDK 1.8对日期时间处理进行了重大改进,引入了`java.time`包,包含了`LocalDate`, `LocalTime`, `LocalDateTime`等新类,提供了更强大、易用的日期时间操作功能。 8. **接口默认方法**:JDK...

    JDK8排序总结

    在Java编程语言中,JDK8引入了许多新特性和改进,其中之一就是对排序算法的优化。这个"JDK8排序总结"的示例代码旨在帮助开发者深入理解Java8中的排序功能。下面我们将详细探讨这些特性及其应用。 首先,Java8在`...

Global site tag (gtag.js) - Google Analytics