深入浅出Java排序:从基础算法到实战优化(下)

文章目录


  • 书接上回,在从基础算法到实战优化上咱们较为详细的讨论了数据结构中常见的八大排序.今天咱们来介绍一下java自带的.sort方法.

一、核心概念与底层实现

Java的排序方法遵循最佳实践,底层根据数据类型做了优化:

  • intlong基本类型数组 :使用双轴快速排序(Dual-Pivot QuickSort),效率更高(时间复杂度O(n log n))。
  • String、自定义对象等引用类型 :使用TimSort(归并排序+插入排序的混合算法),稳定且高效。

二、常用.sort方法用法

1. Arrays.sort()(数组排序)

适用于所有数组类型(基本类型、引用类型),默认升序排列。

示例1:基本类型数组排序(int数组)

java 复制代码
import java.util.Arrays;

public class SortDemo {
    public static void main(String[] args) {
        // 定义无序int数组
        int[] nums = {5, 2, 9, 1, 5, 6};
        
        // 核心:数组排序(原地排序,直接修改原数组)
        Arrays.sort(nums);
        
        // 输出结果:[1, 2, 5, 5, 6, 9]
        System.out.println(Arrays.toString(nums));
    }
}

示例2:自定义对象数组排序(实现Comparable)

如果要排序自定义对象,需让对象类实现Comparable接口,重写compareTo方法定义"自然排序规则"。

java 复制代码
import java.util.Arrays;

// 自定义User类,实现Comparable接口
class User implements Comparable<User> {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 定义排序规则:按年龄升序(this.age - o.age),降序则反过来
    @Override
    public int compareTo(User o) {
        return this.age - o.age;
    }

    // 重写toString,方便打印
    @Override
    public String toString() {
        return "User{name='" + name + "', age=" + age + "}";
    }
}

public class ObjectSortDemo {
    public static void main(String[] args) {
        User[] users = {
            new User("张三", 25),
            new User("李四", 20),
            new User("王五", 30)
        };
        
        // 排序自定义对象数组
        Arrays.sort(users);
        
        // 输出结果:按年龄升序排列
        // [User{name='李四', age=20}, User{name='张三', age=25}, User{name='王五', age=30}]
        System.out.println(Arrays.toString(users));
    }
}

示例3:自定义排序规则(Comparator)

如果不想修改对象类(比如第三方类),或需要临时自定义排序规则,可使用带Comparator的重载方法:

java 复制代码
import java.util.Arrays;
import java.util.Comparator;

public class ComparatorSortDemo {
    public static void main(String[] args) {
        String[] strs = {"apple", "Banana", "cherry", "date"};
        
        // 按字符串长度降序排序(忽略大小写)
        Arrays.sort(strs, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                // 降序:s2长度 - s1长度
                int lenCompare = s2.length() - s1.length();
                // 长度相同则按字母序(忽略大小写)
                return lenCompare != 0 ? lenCompare : s1.compareToIgnoreCase(s2);
            }
        });
        
        // 输出:[cherry, Banana, apple, date]
        System.out.println(Arrays.toString(strs));
    }
}
2. Collections.sort()(List集合排序)

专门用于List接口的实现类(如ArrayListLinkedList),用法和Arrays.sort()类似,默认升序。

示例:List集合排序(Lambda简化Comparator)

Java 8+支持Lambda表达式,可简化Comparator的写法:

java 复制代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ListSortDemo {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(8);
        list.add(2);
        list.add(7);
        list.add(1);
        
        // 方式1:默认升序
        Collections.sort(list);
        System.out.println("升序:" + list); // [1, 2, 7, 8]
        
        // 方式2:Lambda自定义降序
        Collections.sort(list, (a, b) -> b - a);
        System.out.println("降序:" + list); // [8, 7, 2, 1]
    }
}

三、关键注意事项

  1. Arrays.sort()原地排序:直接修改原数组,不会返回新数组;

  2. 基本类型数组的排序是不稳定 的,引用类型排序是稳定的;

  3. Java 8+还提供了List.sort()方法(替代Collections.sort()),写法更简洁:

    java 复制代码
    list.sort((a, b) -> b - a); // 等价于Collections.sort(list, ...)

总结

  1. Java的.sort核心分为Arrays.sort()(数组)和Collections.sort()(List),底层优化保证高性能;
  2. 排序规则分两种:实现Comparable定义"自然排序",或传入Comparator实现"定制排序";
  3. Java 8+推荐用Lambda简化Comparator,List.sort()替代Collections.sort()更简洁。

上面就是.sort的一些基本的用法,我是Dylan ,下期见~

相关推荐
Anastasiozzzz9 分钟前
MySQL JOIN:底层原理、算法演进与多表性能之谜
算法
追随者永远是胜利者6 小时前
(LeetCode-Hot100)253. 会议室 II
java·算法·leetcode·go
Jason_Honey27 小时前
【平安Agent算法岗面试-二面】
人工智能·算法·面试
程序员酥皮蛋7 小时前
hot 100 第三十五题 35.二叉树的中序遍历
数据结构·算法·leetcode
追随者永远是胜利者7 小时前
(LeetCode-Hot100)207. 课程表
java·算法·leetcode·go
仰泳的熊猫8 小时前
题目1535:蓝桥杯算法提高VIP-最小乘积(提高型)
数据结构·c++·算法·蓝桥杯
那起舞的日子8 小时前
动态规划-Dynamic Programing-DP
算法·动态规划
yanghuashuiyue8 小时前
lambda+sealed+record
java·开发语言
闻缺陷则喜何志丹8 小时前
【前后缀分解】P9255 [PA 2022] Podwyżki|普及+
数据结构·c++·算法·前后缀分解
每天吃饭的羊9 小时前
时间复杂度
数据结构·算法·排序算法