
本文详解在java中实现泛型插入排序时,为何原始列表无法保留、如何通过深拷贝或复制机制准确对比排序前后数据,并提供可运行的完整示例代码。
本文详解在java中实现泛型插入排序时,为何原始列表无法保留、如何通过深拷贝或复制机制准确对比排序前后数据,并提供可运行的完整示例代码。
在使用插入排序对 ArrayList 进行原地(in-place)排序时,一个常见误区是:误将同一对象引用既用作“原始列表”,又用作“排序结果”。正如示例代码所示,list1 在调用 insertionSort(list1) 后已被直接修改——排序过程并未创建新列表,而是逐个移动元素、覆盖原位置,因此 list1 的内容已变为升序排列。此时再次打印 "Original List: " + list1,实际输出的是排序后的结果,导致原始数据“丢失”。
要真正对比原始与排序后状态,必须在排序前保留原始数据的独立副本。由于 ArrayList 存储的是对象引用(对包装类型如 Integer、Double、Character 而言,其值不可变),最安全且简洁的方式是使用构造函数创建浅拷贝(对不可变元素等价于深拷贝):
// 正确做法:排序前复制原始列表
ArrayList<Integer> list1 = new ArrayList<>();
for (int num : test1) {
list1.add(num);
}
ArrayList<Integer> originalList1 = new ArrayList<>(list1); // ✅ 保存原始快照
integerSorter.insertionSort(list1); // ✅ 对 list1 排序
System.out.println("Test Example 1");
System.out.println("Original List: " + originalList1); // 输出 [3, 5, 2, 4, 1, 8, 7, 6, 9]
System.out.println("Sorted List: " + list1); // 输出 [1, 2, 3, 4, 5, 6, 7, 8, 9]同理,对 test2(double[])和 test3(char[])也需分别创建 originalList2 和 originalList3。完整修正后的 main 方法关键片段如下:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
// Test Example 1
ArrayList<Integer> list1 = new ArrayList<>();
for (int num : test1) list1.add(num);
ArrayList<Integer> originalList1 = new ArrayList<>(list1);
integerSorter.insertionSort(list1);
System.out.println("Test Example 1");
System.out.println("Original List: " + originalList1);
System.out.println("Sorted List: " + list1);
// Test Example 2
ArrayList<Double> list2 = new ArrayList<>();
for (double num : test2) list2.add(num);
ArrayList<Double> originalList2 = new ArrayList<>(list2);
doubleSorter.insertionSort(list2);
System.out.println("\nTest Example 2");
System.out.println("Original List: " + originalList2);
System.out.println("Sorted List: " + list2);
// Test Example 3
ArrayList<Character> list3 = new ArrayList<>();
for (char ch : test3) list3.add(ch);
ArrayList<Character> originalList3 = new ArrayList<>(list3);
charSorter.insertionSort(list3);
System.out.println("\nTest Example 3");
System.out.println("Original List: " + originalList3);
System.out.println("Sorted List: " + list3);⚠️ 注意事项:
立即学习“Java免费学习笔记(深入)”;
- 不要使用 list1.clone()(返回 Object,需强制转换)或 list1.toArray()(返回 Object[]),易出错;推荐 new ArrayList<>(source),语义清晰且类型安全。
- 本方案适用于 Integer、Double、Character 等不可变包装类。若列表含自定义可变对象,需实现深拷贝逻辑。
- 插入排序本身是稳定的原地排序算法,时间复杂度 O(n²),适合小规模或基本有序数据——但“原地”特性正意味着它会改变输入列表,务必主动备份。
掌握这一模式,不仅能解决当前问题,更是编写健壮排序测试用例的基础实践。

















