arrays.compare() 仅比较同类型数组字典序,非排序方法,不支持自定义逻辑;跨表关联结果应封装为 pojo(如 orderwithuser),再用 arrays.sort() 配合 comparator 实现多字段内存二次排序。

1. 将数据库关联结果映射为统一 POJO
假设你通过 JDBC 或 MyBatis 查询了订单 + 用户信息(LEFT JOIN):
SELECT o.id, o.amount, u.name, u.city FROM orders o LEFT JOIN users u ON o.user_id = u.id
不要用 `Object[]` 或 `Map
示例类:
public class OrderWithUser {
private Long id;
private BigDecimal amount;
private String userName;
private String userCity;
// 构造器、getter 省略
}
查询后批量转为此类实例,存入 `OrderWithUser[]` 数组或 `List
2. 使用 Arrays.sort() + 自定义 Comparator 实现“二次排序”
“二次排序”通常指:先按主字段(如金额降序),相同时按次字段(如城市升序)稳定排序。Java 支持链式比较:
- 对 `OrderWithUser[] arr` 排序:
- 使用 `Arrays.sort(arr, Comparator.comparing(OrderWithUser::getAmount).reversed().thenComparing(OrderWithUser::getUserCity));`
- 若需空值安全,用 `thenComparing(Objects::toString, String.CASE_INSENSITIVE_ORDER)` 或 `nullsLast()`
- 支持任意嵌套字段(如 `o.getUser().getProfile().getLevel()`),只要 getter 可达
3. 处理原始数据无 POJO 场景(不推荐但可应急)
若必须用 `Object[]`(如 `new Object[]{id, amount, name, city}`),可写通用 `Comparator
Comparator<object> cmp = (a, b) -> {
// 比较 amount(索引1),BigDecimal 类型
int amtCmp = ((BigDecimal)a[1]).compareTo((BigDecimal)b[1]);
if (amtCmp != 0) return -amtCmp; // 降序
// 再比 city(索引3),String 类型
return ((String)a[3]).compareTo((String)b[3]);
};</object>
然后调用 `Arrays.sort(rows, cmp);` —— 但可读性差、易出错、无类型检查,仅作临时方案。
4. 注意事项与性能提示
- 内存排序适合结果集较小(如
- `Arrays.sort()` 是双轴快排(对引用类型)或 TimSort(对基本类型数组),稳定高效
- 避免在循环中反复创建 `Comparator`;建议提取为静态常量或复用实例
- 若需分页,排序后用 `Arrays.copyOfRange()` 截取,而非重排全量
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











