`
ni_de_yang_zi
  • 浏览: 29758 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Collections.sort和Arrays.sort在jdk1.6和jdk1.7中区别

    博客分类:
  • java
阅读更多

1.写这边文章的原因:

  最近在线上产品环境发现了部分用户数据返回排序问题(和之前理想中的排序不太一样),由于服务器是集群配置,猜测肯定是某一台排序服务出了问题(之前工作中也遇到过类似的问题),所以立刻去排查代码,发现业务逻辑排序用的是Collections.sort 但是所有服务得代码都一样,为何问题还会出现? 去查了一下资料,发现jdk1.6和jdk1.7的sort处理方式不一样,突然间恍然大悟,前几天让运维升级了一台服务器的jdk,终于找到问题所在了。

 

2.最后结论:

在jdk1.6中Collections.sort()和Arrays.sort()使用的是MergeSort(归并排序),而在jdk1.7中,内部实现换成了TimSort(归并排序的优化版本),其对对象间比较的实现要求更加严格。

a). sgn(compare(x, y)) == -sgn(compare(y, x))

b). (compare(x, y)>0) && (compare(y, z)>0) 意味着 compare(x, z)>0

c). compare(x, y)==0 意味着对于任意的z:sgn(compare(x, z))==sgn(compare(y, z)) 均成立

而我们的代码中,某个compare()实现片段是这样的:

public int compare(ComparatorTest o1, ComparatorTest o2) {

    return o1.getScore() < o2.Score ? 1 : -1;

}

 

可以看出上面的写法违背了a)原则:假设X的value为1,Y的value也为1;那么compare(X, Y) ≠ –compare(Y, X)

 

注:Java 7预留了一个接口以便于用户继续使用Java 6的排序算法:在启动参数中(例如eclipse.ini)添加-Djava.util.Arrays.useLegacyMergeSort=true (这个我并没有实际去测试)

(查阅相关资料后发现有网友说jdk1.7在这个地方会抛异常,但是我的jdk1.8并未抛出异常,只是排序有点问题)

 

解决方法:

将代码做如下修改

public int compare(ComparatorTest o1, ComparatorTest o2) {

     return o2.getScore().compareTo(o1.getScore());

}

分享到:
评论

相关推荐

    jdk1.7安装包下载

    7. **文件系统API增强**:` java.nio.file `包在JDK1.7中得到了加强,引入了` Files `类和` Path `接口,提供了更强大的文件操作功能,如更灵活的路径操作和权限管理。 8. **并发改进**:` java.util.concurrent `...

    JDK1.6中文版AND JDK1.8英文.zip

    这里我们关注的是JDK 1.6中文版和JDK 1.8英文版的API文档。 API(Application Programming Interface)文档是软件开发的重要参考资料,它详细列出了所有可用的类、接口、方法和构造函数,以及它们的使用方式。对于...

    JDK1.6 API 中文 高清完整CHM版

    **JDK 1.6 API 中文高清完整 CHM 版**是针对Java开发者极其重要的参考资料,它提供了Java Development Kit 1.6版本的所有公共类、接口和方法的详细文档,便于开发者理解和使用Java平台的核心库。CHM(Compiled ...

    JDK1.7 64位官方版

    2. **多路归并排序**:Java 7的`Arrays.sort()`方法和`Collections.sort()`方法采用了新的多路归并排序算法,提升了大规模数据排序的性能。 3. **try-with-resources**:这个新语法简化了资源管理,尤其是文件或...

    JDK_API_1_6_zh_CN.rar_java jdk 1.6 A_java jdk api_jdk 1.6 API zh

    Java JDK 1.6 API文档是Java开发者的重要参考资料,它详细地介绍了JDK 1.6版本中的类、接口、方法和异常,为开发者提供了全面而深入的编程指南。这份中文版的API文档,对于中文使用者来说,无疑降低了学习和理解的...

    java api1.6、1.7

    Java API 1.6 和 1.7 是Java开发的关键组成部分,它们包含了Java标准库的详细文档,这些库是编写Java应用程序和服务器端程序的基础。这两个版本在Java发展历程中占据了重要地位,引入了许多新特性,优化了性能,并...

    jdk1.7免安装版

    最后,JDK1.7的免安装版意味着用户可以直接下载解压后使用,无需进行复杂的安装过程,简化了部署,便于在不同环境中快速配置Java开发环境。 总的来说,JDK1.7免安装版是一个功能强大的Java开发工具,它包含了一系列...

    Jdk api 1.6中文文档

    2. **集合框架**:在1.6版本中,Java的集合框架已经相当成熟,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)、Map(如HashMap和TreeMap)等接口及其实现,以及实用工具类`Collections`和`Arrays`...

    JAVA_JDK_1.7

    在`Collections`和`Arrays`类中添加了一些静态工厂方法,如`Collections.emptyList()`, `Collections.emptyMap()`等,可以更方便地创建不可变的集合实例。 11. **改进的异常处理**: 允许一个`catch`子句捕获多个...

    JDK1.6 API帮助文档.CHM

    《JDK1.6 API帮助文档.CHM》是Java开发者的重要参考资料,它包含了Java Development Kit (JDK) 1.6版本的所有公共类、接口、枚举和异常的详细说明。这个CHM(Microsoft Compiled HTML Help)文件是Windows平台上的...

    jdk win64 1.7

    JDK 1.7在安全性方面进行了增强,例如改进的证书管理、更强的加密算法支持以及针对Java插件和Applet的安全性更新。 总结来说,"jdk win64 1.7"是Java开发的关键组成部分,尤其适合在64位Windows系统上进行开发工作...

    JDK1.7 api文档英文原版

    5. **新集合工厂方法**:在`Collections`和`Arrays`类中添加了新的工厂方法,如`of()`和`copyOf()`,简化了集合和数组的创建过程。 6. **Fork/Join框架**:Java 7引入了`java.util.concurrent.ForkJoinPool`和`java...

    jdk1.7源码包含util

    在JDK 1.7版本中,"util"指的是`java.util`包,它是Java标准库中的核心部分,提供了大量用于日常编程的工具类和接口。这个包的源码对于理解Java内部机制和提高编程技能至关重要。 `java.util`包包含了多种数据结构...

    jdk1.7中文api打包集合.rar

    `java.util.Collections`和`java.util.Arrays`类增加了新的工厂方法,如`Collections.emptyList()`、`Collections.emptyMap()`,以及`Arrays.asList()`,简化了集合和数组的创建。 Java API 1.7中文版的出现,使得...

    JDK 1.6 API_JDKAPI帮助文档_

    此外,JDK 1.6 API还包含了诸如泛型、注解(Annotation)等重要特性,以及各种实用工具类,如`Math`、`Arrays`、`Collections`等。通过查阅这个API文档,开发者可以深入理解Java 1.6的特性和使用方式,提高编程效率...

    jdk1.7 64位

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

    Java6JDK1.6新特性总结大全附代码.docx

    JAXB 2在JDK 1.6中集成到Java SE平台,使得对象与XML之间的映射变得更加简单和灵活。 - **主要特点**: - 利用JDK 5的注解功能简化了配置。 - 支持复杂的XML结构。 - 提供了更强大的错误处理机制。 - **示例代码*...

    jdk1.7版本 旧版本jdk

    同时,开发者应利用JDK 1.7的特性来提高代码质量和效率,但也要意识到这些特性在新版本中的改进和扩展。 总之,JDK 1.7是一个里程碑式的版本,它推动了Java语言的进步,但鉴于其已不再被官方支持,使用时需谨慎。...

    jdk1.7 7u80 64位

    4. **多路归并排序**:Java 7引入了一个新的并发排序算法,提高了`Arrays.sort()`和`Collections.sort()`的性能。 5. **新文件系统API (NIO.2)**:提供了更高级别的文件操作,如路径、文件属性和异步I/O。 6. **...

Global site tag (gtag.js) - Google Analytics