在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
分享到:
相关推荐
JDK 7 中引入的 Fork/Join 模式是一种基于分治策略的并行编程模型,旨在简化在多核处理器环境下实现高效的并行计算。这一模式的核心思想是将复杂的大任务拆分成一系列小任务,然后将这些小任务并行执行,最后再合并...
2. **多路归并排序**:Java 7中的Arrays.sort()方法采用了新的多路归并排序算法,提升了数组排序的性能。 3. **Try-with-resources语句**:这是一种新的异常处理结构,允许开发者在try语句块中声明资源,资源会在...
- **多路归并排序**:JDK7中的`Arrays.sort()`和`Collections.sort()`方法使用了新的多路归并排序算法,提高了排序性能。 - **Fork/Join框架**:用于并行执行任务,提高计算密集型任务的执行效率。 - **元空间**...
7. **默认方法**:在接口中,JDK 1.8允许定义带有实现的方法,称为默认方法。这使得接口可以扩展功能而不破坏已有实现,比如`Iterable`接口的`forEach`方法。 8. **Nashorn JavaScript引擎**:JDK 1.8内置了Nashorn...
2. **多路归并排序**:Java 7的`Arrays.sort()`和`Collections.sort()`方法使用了更高效的多路归并排序算法,提高了大规模数据排序的性能。 3. **文件系统API增强**:NIO.2(New I/O 2)引入了`java.nio.file`包,...
尽管Lambda表达式作为官方特性是在JDK 8中正式引入,但在JDK 7 Update 80中已经可以预览其部分功能。Lambda表达式是一种更简洁的函数表示方式,可以大大简化代码并提高可读性。例如: ```java List<String> list = ...
以下是一些Java 7中的关键特性: 1. **多路归并排序**:Java 7的`Arrays.sort()`方法支持对数组进行更高效的排序,通过使用多路归并排序算法,大大提升了排序性能。 2. **try-with-resources**:这是一种新的异常...
JDK1.7,也被称为Java 7,是Oracle公司发布的Java平台的一个重要版本,发布于2011年。这个版本引入了许多新特性、改进和优化,旨在提高开发效率和程序性能。 首先,JDK1.7的一个显著特点是其类型推断(Type ...
2. **多路归并排序**:在Java 7中,`Arrays.sort()` 方法使用了多路归并排序算法,提高了排序性能,尤其是处理大数据量时。 3. **字符串连接优化**:Java 7对字符串连接操作进行了优化,使用StringBuilder时,如果...
1. **多路归并排序**:在Java 7中,`java.util.Arrays.sort()`方法进行了优化,采用了多路归并排序算法,提高了排序性能,尤其对于大数据量的数组,效果显著。 2. **字符串inswitch**:新增了`switch`语句对字符串...
1. **钻石操作符**:在Java 7中,编译器可以自动推断出泛型类型的实例化参数,简化了代码,如`List<String> list = new ArrayList();` 2. **字符串in switch语句**:现在可以直接在switch语句中使用字符串,提高了...
本篇将围绕"jdk 1.8 api"这一主题,深入探讨Java SDK 1.8中的关键知识点,帮助开发者提升效率,实现更高效、更优雅的代码编写。 1. **Lambda表达式** JDK 1.8引入了Lambda表达式,这是对函数式编程的一大迈进。...
3. **多路归并排序**:Java 7的`Arrays.sort()`和`Collections.sort()`方法采用了新的多路归并排序算法,提高了大规模数据排序的效率。 4. **文件系统API增强**:NIO.2引入了更现代的文件系统API,提供了异步I/O...
10. **并行GC的改进**:G1垃圾收集器在Java 7中得到了优化,提供更好的停顿时间预测和整体性能。 JDK1.7的64位版本是为了在64位操作系统上运行Java应用而设计的,它可以利用64位系统的内存优势,处理更大规模的数据...
例如,`Collections.sort(List)`就是一个泛型算法,可以对任何实现了`Comparable<T>`接口的列表进行排序。 #### 使用与自定义泛型 在使用泛型类或泛型算法时,理解类型参数的约束至关重要。例如,如果一个泛型类...
2. **多路归并排序**:JDK7在`Arrays.sort()`方法中实现了多路归并排序,提高了数组排序的性能。 3. **try-with-resources**:此特性使得资源管理更加简便,自动关闭在try块中打开的流和其他可关闭的资源。 4. **...
例如,`java.util.List<T>`接口和`Collections.sort(List)`方法展示了泛型在容器和算法上的应用。 2. **枚举(Enums)**: JDK1.5引入的枚举类型结束了Java中使用常量类来模拟枚举的尴尬局面。枚举可以看作是一种...
- **多路归并排序**:在Java 7中,`Arrays.sort()` 方法得到了优化,采用了多路归并排序算法,提升了大规模数据排序的性能。 - **try-with-resources**:这是一种新的语法结构,可以自动关闭实现了 `AutoCloseable...
7. **Date与Time API**:JDK 1.8对日期时间处理进行了重大改进,引入了`java.time`包,包含了`LocalDate`, `LocalTime`, `LocalDateTime`等新类,提供了更强大、易用的日期时间操作功能。 8. **接口默认方法**:JDK...
在Java编程语言中,JDK8引入了许多新特性和改进,其中之一就是对排序算法的优化。这个"JDK8排序总结"的示例代码旨在帮助开发者深入理解Java8中的排序功能。下面我们将详细探讨这些特性及其应用。 首先,Java8在`...