在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安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7...
利用jdk自带算法实现的AES加解密工具类及Base64编解码工具类、 文件操作工具类、aes扩展无限制权限策略文件等。 在jdk1.7环境亲测通过。
JDK1.8中文文档 JDK1.8中文 jkd8中文文档 JDK中文版 标准的API规范文档,谷歌中文翻译 全翻译
jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载
用jdk原生api实现一些简单的加密算法,详情见:http://blog.csdn.net/zhong1113/article/details/50451751
jdk7 jdk8 jdk9 jdk10 jdk11 jdk12 jdk13 jdk14 (win-64位) 资源共享
jdk7chm,java7帮助,jdk7api,jdk1.7帮且文档,jdk7api chm,JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的Java SDK。JDK 是整个Java的核心,包括了...
jdk7 jdk-7u80-linux-x64 网盘下载
jdk7解除aes加密限制,java.security.InvalidKeyException:illegal Key Size
JDK7 API 中文 文档.CHM
1.1 JDK7新特性<一>概述 . . . . . . . . . . . . . . 1.2 JDK7新特性<二> 语法 . . . . . . . . . . . . . 1.3 JDK7新特性<三> JDBC4.1 . . . . . . . . . . 1.4 JDK7新特性<四> NIO2.0 文件系统 . . . 1.5 JDK...
jdk7免安装版,可以正常使用,有问题可以联系我,JDK(Java Development Kit)就是Java的开发工具包,无论是开发javase,javaee,javaee.是给Java开发者必须用到的开发工具
jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-...
jdk7,openjdk7,适用于arm64、aarch64架构linux等国产化服务器,如银河麒麟V10、uos等服务器系统。 详细信息 jdk7 arm64 aarch64 。亲测可用。
jdk8中文手册
JDK 1.8中文API文档
jdk7安装程序
JAVA JDK7 1.7.80 Windows 32位版本,生产环境中亲自安装好用。
JDK1.7最终版,jdk-7u80,包含文件如下: jdk-7u80-linux-i586.gz jdk-7u80-linux-x64.tar.gz jdk-7u80-windows-i586.exe jdk-7u80-windows-x64.exe
jdk7安装包jdk7安装包jdk7安装包jdk7安装包jdk7安装包jdk7安装包jdk7安装包