0

0

Java中的java.util.Collections.sort排序稳定性说明_排序算法内幕

P粉602998670

P粉602998670

发布时间:2026-03-05 12:12:11

|

965人浏览过

|

来源于php中文网

原创

稳定。collections.sort()在java 7+中对对象列表排序时底层调用arrays.sort(object[]),采用稳定timsort算法,保证相等元素相对位置不变;基本类型数组排序虽不稳定,但不参与collections.sort()调用链。

java中的java.util.collections.sort排序稳定性说明_排序算法内幕

Java的Collections.sort()到底稳不稳定?

稳定。只要传入的List实现支持随机访问(比如ArrayList),Collections.sort()在Java 7及以后版本中,底层用的是**双轴快排(Dual-Pivot Quicksort)+ 归并排序(Timsort)混合策略**,但对Object[]数组排序时,实际调用的是Arrays.sort(Object[])——它明确保证稳定。

关键点在于:稳定性只针对**相同元素的相对位置不改变**。如果你用自定义Comparator把两个逻辑上不同的对象判为“相等”,那它们的顺序就由原始位置决定,且这个顺序会被保留。

为什么有时候看着“不稳定”?常见错因

不是算法不稳,而是你没看清比较逻辑或数据状态:

  • 用了intlong比较时写成a - b,导致整数溢出,返回值符号翻转,Comparator行为失常 —— 改用Integer.compare(a, b)Long.compare(a, b)
  • 自定义Comparator里漏了null处理,遇到null字段抛NullPointerException,排序中途失败,列表可能处于半修改状态
  • LinkedList传给Collections.sort():虽然能跑,但会先转成数组再排,再刷回链表,既慢又容易让人误以为“原地排序失效”
  • 排序前列表已被其他线程修改,或本身是未同步的并发集合(如CopyOnWriteArrayList),排序看到的快照和你预期不一致

Collections.sort()Arrays.sort()的区别在哪?

表面看都是排序,底层策略和稳定性保障层级不同:

Pascal基础教程 Pascal入门必备基础教程 CHM版
Pascal基础教程 Pascal入门必备基础教程 CHM版

无论做任何事情,都要有一定的方式方法与处理步骤。计算机程序设计比日常生活中的事务处理更具有严谨性、规范性、可行性。为了使计算机有效地解决某些问题,须将处理步骤编排好,用计算机语言组成“序列”,让计算机自动识别并执行这个用计算机语言组成的“序列”,完成预定的任务。将处理问题的步骤编排好,用计算机语言组成序列,也就是常说的编写程序。在Pascal语言中,执行每条语句都是由计算机完成相应的操作。编写Pascal程序,是利用Pasca

下载

立即学习Java免费学习笔记(深入)”;

  • Collections.sort(List):只接受List,内部调用list.toArray()Arrays.sort(Object[]) → 最终走Timsort(稳定)
  • Collections.sort(List, Comparator):同上,只是多传个比较器,不影响稳定性
  • Arrays.sort(int[])Arrays.sort(double[])等基本类型重载:用双轴快排,**不稳定** —— 但这些根本不会出现在Collections.sort()调用链里
  • 所以只要你没绕过Collections.sort()直接去排基本类型数组,就不用操心“不稳”问题

真要验证稳定性?动手试比读源码快

写个带标识的简单类,插入两个“值相等但ID不同”的实例,排序后检查ID顺序:

class Item {
    int value;
    int id;
    Item(int v, int i) { value = v; id = i; }
}
List<Item> list = Arrays.asList(new Item(1, 100), new Item(2, 200), new Item(1, 99));
Collections.sort(list, Comparator.comparingInt(i -> i.value));
// 排序后,两个value==1的Item,id为100的一定在id为99的前面(原始顺序)

注意:别用System.out.println(list)草率下结论 —— 确保你打印的是item.id,而不是只看item.value;也别在IDE调试器里靠“观察变量顺序”判断,得靠代码显式断言。

最易被忽略的一点:稳定性只在单次排序内成立。如果排序后又手动改了某个元素的字段,再排一次,那“原始顺序”已经变了,别指望两次排序结果之间有可复现的相对关系。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

252

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1008

2024.03.01

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

408

2023.09.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

930

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

603

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

212

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

4

2026.03.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.1万人学习

C# 教程
C# 教程

共94课时 | 10.7万人学习

Java 教程
Java 教程

共578课时 | 77万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号