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

2023-05-16

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());

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Collections.sort和Arrays.sort在jdk1.6和jdk1.7中区别 的相关文章

随机推荐

  • 客家刘开七、刘广传刘氏七律族诗赏析V2.0

    七律 刘氏族诗 南宋 刘广传 骏马骑行各出疆 xff0c 任从随地立纲常 年深外境皆吾境 xff0c 日久他乡即故乡 早晚勿忘亲命语 xff0c 晨昏须顾祖炉香 苍天佑我卯金氏 xff0c 八七男儿共炽昌 一 平仄性赏析 除了 卯 字 xf
  • 系统mysql、sqlserver数据库兼容方案

    一 技术选型 springboot2 4 43 mybatisplus3 4 43 mysql5 7 43 redis3 0 43 二 编写目的 如果产品开发默认数据库采用mysql xff0c 但是当客户提出数据库需要采用Sqlserve
  • eclipse maven plugin 插件 安装 和 配置

    离线插件 点击下载离线安装包 xff1a eclipse maven plugin zip for eclipse helios or higher 解压缩到任意目录 xff08 如这里的plugins目录 xff09 xff1a 目录路径
  • Android 使用View Binding来代替频繁findViewById来得到view

    从 Android Studio 3 6 开始 xff0c 视图绑定能够通过生成绑定对象来替代 findViewById xff0c 从而可以帮您简化代码 移除 bug xff0c 并且从 findViewById 的模版代码中解脱出来 在
  • 李开复辞职前后的故事

    这些故事出自即将发售的 世界因你不同 xff1a 李开复自传 一书 xff0c 由李开复本人和北京青年报记者范海涛合写而成 以下为故事部分节选 xff1a 今天 xff0c 我开得很慢 xff0c 仿佛是让自己的心情在辽阔的天空下能够更加安
  • 哈哈,终于知道CSDN怎么改头像了

    话说之前一直郁闷 xff0c 说改头像的功能还没修好 xff0c 一直说服务器错误 今天偶尔发现 xff0c 右上角有个设置 xff0c 原来在这里可以改 我还发了几封邮件给CSDN的admin xff0c 居然只知道道歉 xff0c 不告
  • tail -f 在串口中查看日志文件

    tail f opt log log mi tail follow opt log log mi 如果想从串口中查看日志文件 用tail 命令就可以了
  • 10-WorkManager

    WorkManager 文章目录 WorkManager概览使用入门将WorkManager添加到项目中创建后台任务配置运行任务的方式和时间将任务提交给系统后续步骤 方法指南定义WorkRequest工作约束初始延迟重试和退避政策定义任务的
  • 11-保存状态

    保存状态 文章目录 保存状态用户预期和系统行为用户发起的界面状态解除系统发起的界面状态解除 用于保留界面状态的选项使用 ViewModel 处理配置更改使用 onSaveInstanceState 作为后备方法来处理系统发起的进程终止针对复
  • 12 - ViewModel的已保存状态模块

    ViewModel的已保存状态模块 文章目录 ViewModel的已保存状态模块设置和使用存储和检索值可接受的类其他资源Codelab ViewModel 对象可以处理配置更改 xff0c 因此您无需担心旋转时或其他情况下的状态 但是 xf
  • 13 - 将Kotlin协程与架构组件一起使用

    将Kotlin协程与架构组件一起使用 文章目录 将Kotlin协程与架构组件一起使用添加KTX依赖项生命周期感知型协程范围ViewModelScopeLifecycleScope 暂停生命周期感知型协程将协程与LiveData一起使用其他资
  • Android读取Word文档

    附注 xff1a 本文使用的jar包是tm extractors 0 4的jar包 xff08 麻烦自己自行搜索并下载 xff09 xff0c 地址稍后再补上来 读取隐私协议文档内容 64 return private String sho
  • Android studio中“import org.apache.http.Header;”没用?

    Android M 起默认移除了Apache HTTP xff1a https developer android com intl zh cn preview behavior changes html 要使用的话 xff0c 要这么干
  • 解决华为手机不显示Log日志

    1 xff09 进入工程模式 有两种方式可以进入工程模式 xff1a a 在拨号界面输入 2846579 b 若是小米4 0系统 MIUI xff0c 进入 设置 gt 全部设置 gt 原厂设置 gt 工程模式 2 打开Log 1 依次进入
  • 将字符串时间转为毫秒值

    将字符串格式的时间转为毫秒值 64 param dateTime 字符串时间 xff08 格式 xff1a 2015 12 31 23 59 53 xff09 64 return public Long getLongFromString
  • 在Android Studio中使用JUNIT测试

    单元测试 xff08 unit testing xff09 xff0c 是指对软件中的最小可测试单元进行检查和验证 比如一个函数 xff0c 一个方法等 本文概述的内容 xff1a 在Android Studio中初步使用JUNIT测试 步
  • (极力推荐)BW:How to load and generate a custom hierarchy in SAP Business Warehouse (SAP BW) without using flat files

    这篇文章 xff0c 真是救了哥 xff0c 所以非常感谢这位作者 你看 xff0c 人家也是 2011 年 2 月 3 号才写的 xff0c 量身打造 xff0c 多好的人 xff0c 刚好赶上我了 PS xff1a 前段时间设计的文本抽
  • Windows Media Player控件研究

    初级问题 xff1a 我的那个定时提醒程序中要用到它 xff0c 初步使用问题已解决 基本使用步骤如下 xff1a 一 往控件箱中添加此控件 xff1a wmp dll 二 往窗体上拖控件 三 wmp URL 61 XXXX wmp pla
  • The SDK platform-tools version(24) is too old to check APIs compiled with API 25

    在实际开发中 xff0c 我们有时候会遇到红色的warning xff1a The SDK platform tools version 24 is too old to check APIs compiled with API 25 直白
  • Collections.sort和Arrays.sort在jdk1.6和jdk1.7中区别

    1 写这边文章的原因 xff1a 最近在线上产品环境发现了部分用户数据返回排序问题 xff08 和之前理想中的排序不太一样 xff09 xff0c 由于服务器是集群配置 xff0c 猜测肯定是某一台排序服务出了问题 xff08 之前工作中也