Comparator中compare的语义:
接口约定返回值与o1,o2的相对大小的对应关系,
即ret<0时,语义上等价于o1<o2;
ret==0时,语义上等价于o1==o2;
ret>0时,语义上等价于o1>o2.
具体Comparator子类override compare函数时,则需要依据约定,即采用o1-o2的策略
上述语义约定在排序算法上会有何影响呢?以JDK7为例,分析Collection.sort的内部实现
阐述下sort与compare约定的关系。一般Comparator的用法如下:
其调用关系如下:
核心调用为
老版本使用归并排序(属于稳定排序,性能弱于快排),新版本使用TimSort排序(一种改良的归并排序算法,其算法复杂度为O(nlogn), 空间复杂度为n/2,在随机数组中性能较优),介绍如下:
此处不赘述这两种算法的实现细节,只关注comparator在排序中的语义作用。以传统归并实现为例:
c.compare>0时交换dest[j-1]和dest[j],排序时有升序和降序之分,升还是降由compare的规则决定,
即,若compare(dest[j-1], dest[j])>0内部规则为dest[j-1] > dest[j],导致small value在数组左侧,即升序;
若compare>0内部规则为dest[j] > dest[j-1], 导致small value在数组右侧,即降序。
总结一下:
1.Collections.sort内部采用(改良)归并排序算法
2.Collections.sort排序算法定义了规则:compare<=0时value位置不变,compare>0时交换位置
3.compare(o1, o2)其中o1对应dest[j-1],o2对应dest[j],分别代表数组中相邻比较的左右值
4.采用o1-o2方式结合排序内部规则,导致升序,o2-o1导致降序

转载于:https://www.cnblogs.com/tonybright/p/4903006.html

Java Sort中Comparator的语义分析相关推荐

  1. java中sort函数comparator的使用_Comparator 与排序

    Java 排序 Java 中经常需要对一个列表进行排序,列表中可能是基本数据类型,也可能是自定义对象,对于自定义对象的排序我们可能只想按照其某个属性排序,甚至多种条件组合对其排序,这些都可以借助于 C ...

  2. Java8 Collections.sort()及Arrays.sort()中Lambda表达式及增强版Comparator的使用

    摘要:本文主要介绍Java8 中Arrays.sort()及Collections.sort()中Lambda表达式及增强版Comparator的使用. 不废话直接上代码 import com.goo ...

  3. JAVA语言-比较器Comparator(java中Comparable和Comparator的区别)

    文章目录 一.什么是Comparator 二.Java compare方法和compareTo方法 三.java中Comparable和Comparator的区别 Comparator的例子 三.de ...

  4. Java 中Comparator 的使用,实现集合排序

    目标:实现对Person 对象的年龄,从小到大排序 1.实现排序 1 package com.app; 2 3 import java.util.ArrayList; 4 import java.ut ...

  5. Java 8中一些常用的全新的函数式接口

    这一篇属于菜鸟级博客,只是介绍了一些在Java 8中新出现的一些很有用的接口,通过一些简单的例子加以说明,没有深入地阐述. 函数式接口 什么是函数式接口? 函数式接口,@FunctionalInter ...

  6. java策略管理_详解Java编程中的策略模式

    策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 策略模式的结构 策略模式 ...

  7. 聚合中返回source_Java 8 中的 Streams API 详解—— Streams 的背景以及 Java 8 中的使用详解...

    为什么需要 Stream Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 ...

  8. java中使用es的dsl_基于DSL的基于图论的Java程序中输入图数据的方法

    java中使用es的dsl 我们大多数人已经编写了一些处理图论算法的程序,例如找到两个顶点之间的最短路径,找到给定图的最小生成树等等. 在这些算法的每一种中,表示图形的编程方式是使用邻接矩阵或邻接列表 ...

  9. Java 8中的功能接口是什么? @功能注释和示例

    函数接口是Java 8最重要的概念之一,实际上为lambda表达式提供了动力,但是许多开发人员没有首先了解函数接口在Java 8中的作用就花了很多精力来理解它,并花时间学习lambda表达式和Stre ...

最新文章

  1. 强人总结的哄老婆秘籍
  2. request,response,session,application,out对象的常用调用的函数
  3. GitHub Actions,卧槽!牛批!
  4. Spring MVC 3:上传多个文件
  5. 学习设计模式 - 六大基本原则之开闭原则
  6. coreseek mysql_coreseek (sphinx)+ Mysql + Thinkphp搭建中文搜索引擎详解
  7. Vite Vue项目加载Cesium模块
  8. 1032. 字符流(每日一难phase2--days28)
  9. 【方法】如何提高专注能力
  10. DEV中右键菜单如何只在非空单元格上显示?
  11. C语言歌手评分系统(入门水平)
  12. 搭档之家|新零售:社交电商的光明尽头
  13. RTKLIB学习总结(六)导航电文、卫星位置计算
  14. SequoiaDB巨杉数据库成为唯一入选 “硅谷2016 大数据地形图”中国厂商, 企业级市场超越MongoDB等海外产品...
  15. js重新加载iframe框架
  16. ASCII 控制码说明
  17. tpc-c 测试方案
  18. 【迭代式开发】V1软件需求规格说明书——大数据开发实战项目(二)
  19. 艾美捷Bio-Helix CCH321 超敏ECL化学发光试剂盒(皮克级)特点
  20. 《前端开发者的进阶之路》

热门文章

  1. 在VM上安装centOS后的网络配置
  2. Windows API获取系统配置文件的配置参数
  3. 解析nginx负载均衡
  4. [转]MySQL实现分页查询
  5. Docker 使用Dockerfile构建tomcat镜像
  6. xadmin引入样式无效
  7. 前端每周清单第 49 期:Webpack 4 Beta 尝鲜,React Windowing 与 setState 分析
  8. Java集合类解析 ***
  9. Window10+VS2015+DevExpress.net 15.1.7完美破解(图)
  10. 1131: 零起点学算法38——求阶乘和