17370845950

在Java里如何编写简单排序程序_Java算法基础项目说明
Java排序应优先用Arrays.sort()处理数组、Collections.sort()处理List,自定义规则用Comparator;手写冒泡仅限教学;需注意null值处理和基本类型降序限制。

Java里写简单排序程序,核心不是“选哪个算法”,而是“根据场景选对实现方式”——数组排序用 Arrays.sort(),集合排序用 Collections.sort(),自定义规则就补 Comparator,硬要手写才碰冒泡或快排。

Arrays.sort() 排基本类型和字符串数组

这是最常用、最稳的选择。它对 int[]double[]String[] 等内置类型做了高度优化,底层混合了双轴快排(基本类型)和 TimSort(对象数组),性能和稳定性都远超手写。

常见错误是传错类型:比如把 List 直接丢给 Arrays.sort(),会报 Cannot resolve method 'sort(java.util.List)' ——因为这个方法只认数组。

  • int[] nums = {3, 1, 4, 1, 5}; Arrays.sort(nums); → 升序完成
  • String[] words = {"banana", "apple", "cherry"}; Arrays.sort(words); → 按字典序升序
  • 降序?基本类型不支持直接降序,得转成包装类

    数组再用 Comparator.reverseOrder()

Collections.sort()List 并自定义顺序

当你手里是 ArrayListLinkedList,别转数组再排,直接用 Collections.sort()。它要求元素实现 Comparable,否则必须显式传 Comparator

容易踩的坑是误用匿名内部类写法导致语法臃肿,Java 8+ 强烈推荐用 Lambda:

  • List list = Arrays.asList(3, 1, 4); Collections.sort(list); → 默认升序
  • Collections.sort(list, (a, b) -> b - a); → 降序(注意整数溢出风险,更安全用 Integer.compare(b, a)
  • Collections.sort(list, Comparator.reverseOrder()); → 同样降序,语义清晰

手写冒泡排序只适合教学或极特殊约束场景

真在生产代码里写冒泡,除非面试被要求、或嵌入式环境连 java.util 都不让用。它时间复杂度 O(n²),1000 个元素就要百万级比较,而 Arrays.sort() 对 1000 个 int 通常不到 1ms。

如果非写不可,注意边界判断和提前退出逻辑,否则纯浪费 CPU:

public static void bubbleSort(int[] arr) {
    int n = arr.length;
    for (int i = 0; i < n - 1; i++) {
        boolean swapped = false;
        for (int j = 0; j < n - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                swapped = true;
            }
        }
        if (!swapped) break; // 没交换说明已有序,直接退出
    }
}

排序稳定性与 null 值处理是实际项目里的暗礁

Arrays.sort() 对对象数组(如 String[])是稳定排序,相同元素相对位置不变;但对 int[] 这种基本类型,“稳定”无意义。而 Collections.sort() 默认也稳定。

真正容易崩的是 null 值——Arrays.sort(new String[]{"a", null, "b"}) 直接抛 NullPointerException。解决办法只有两个:

  • 预处理:用 list.removeIf(Objects::isNull) 或过滤流 .filter(Objects::nonNull)
  • 自定义 Comparator 显式约定 null 排前面还是后面,例如:Comparator.nullsFirst(String::compareTo)

没处理 null 的排序代码,在测试数据干净时跑得飞起,一进真实环境就挂,这种问题往往拖到上线后才暴露。