目录一、需求说明1. 原生手动交换最通用推荐2. 借助 Collections 工具类简洁关键注意点3. Java 8 Stream 写法不修改原列表返回新集合总结选型这里介绍 Java 中List 局部反转的几种常用实现包含原生写法、工具类、流式写法适配ArrayList/LinkedList等常规 List。一、需求说明指定起始下标 start、结束下标 end左闭右开[start, end)反转区间内元素。 例[1,2,3,4,5]start1, end4→ 结果[1,4,3,2,5]1. 原生手动交换最通用推荐通过双指针首尾交换实现不依赖额外包性能最优。import java.util.ArrayList; import java.util.List; public class ListReverse { /** * 局部反转 List [start, end) * param list 原集合 * param start 起始索引包含 * param end 结束索引不包含 */ public static T void reversePartial(ListT list, int start, int end) { // 边界校验 if (list null || start 0 || end list.size() || start end) { return; } // 双指针交换 int left start; int right end - 1; while (left right) { // 交换元素 T temp list.get(left); list.set(left, list.get(right)); list.set(right, temp); left; right--; } } public static void main(String[] args) { ListInteger list new ArrayList(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); reversePartial(list, 1, 4); System.out.println(list); // [1, 4, 3, 2, 5] } }2. 借助 Collections 工具类简洁利用List.subList()截取子列表再用Collections.reverse()反转。注意subList返回原列表视图修改会直接影响原集合。import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Demo { public static void main(String[] args) { ListInteger list new ArrayList(List.of(1,2,3,4,5)); int start 1; int end 4; // 截取子列表并反转 ListInteger subList list.subList(start, end); Collections.reverse(subList); System.out.println(list); // [1, 4, 3, 2, 5] } }关键注意点subList(start, end)同样是左闭右开不能对 subList 做增删操作否则会触发ConcurrentModificationException适合简单场景代码极简。3. Java 8 Stream 写法不修改原列表返回新集合如果不想改动原 List生成新的反转后集合import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; public class StreamReverse { public static void main(String[] args) { ListInteger origin new ArrayList(List.of(1,2,3,4,5)); int start 1; int end 4; ListInteger result IntStream.range(0, origin.size()) .mapToObj(i - { if (i start i end) { // 区间内倒序取值 return origin.get(end - 1 - (i - start)); } else { // 区间外保留原值 return origin.get(i); } }) .collect(Collectors.toList()); System.out.println(result); // [1, 4, 3, 2, 5] System.out.println(origin); // 原列表不变 } }总结选型追求性能、通用、可复用→ 双指针手动交换方案 1代码简洁、快速实现→subList Collections.reverse方案 2不修改原集合、函数式风格→ Stream 写法方案 3。
Java 中 List 局部反转方法
发布时间:2026/6/13 0:24:51
目录一、需求说明1. 原生手动交换最通用推荐2. 借助 Collections 工具类简洁关键注意点3. Java 8 Stream 写法不修改原列表返回新集合总结选型这里介绍 Java 中List 局部反转的几种常用实现包含原生写法、工具类、流式写法适配ArrayList/LinkedList等常规 List。一、需求说明指定起始下标 start、结束下标 end左闭右开[start, end)反转区间内元素。 例[1,2,3,4,5]start1, end4→ 结果[1,4,3,2,5]1. 原生手动交换最通用推荐通过双指针首尾交换实现不依赖额外包性能最优。import java.util.ArrayList; import java.util.List; public class ListReverse { /** * 局部反转 List [start, end) * param list 原集合 * param start 起始索引包含 * param end 结束索引不包含 */ public static T void reversePartial(ListT list, int start, int end) { // 边界校验 if (list null || start 0 || end list.size() || start end) { return; } // 双指针交换 int left start; int right end - 1; while (left right) { // 交换元素 T temp list.get(left); list.set(left, list.get(right)); list.set(right, temp); left; right--; } } public static void main(String[] args) { ListInteger list new ArrayList(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); reversePartial(list, 1, 4); System.out.println(list); // [1, 4, 3, 2, 5] } }2. 借助 Collections 工具类简洁利用List.subList()截取子列表再用Collections.reverse()反转。注意subList返回原列表视图修改会直接影响原集合。import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Demo { public static void main(String[] args) { ListInteger list new ArrayList(List.of(1,2,3,4,5)); int start 1; int end 4; // 截取子列表并反转 ListInteger subList list.subList(start, end); Collections.reverse(subList); System.out.println(list); // [1, 4, 3, 2, 5] } }关键注意点subList(start, end)同样是左闭右开不能对 subList 做增删操作否则会触发ConcurrentModificationException适合简单场景代码极简。3. Java 8 Stream 写法不修改原列表返回新集合如果不想改动原 List生成新的反转后集合import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; public class StreamReverse { public static void main(String[] args) { ListInteger origin new ArrayList(List.of(1,2,3,4,5)); int start 1; int end 4; ListInteger result IntStream.range(0, origin.size()) .mapToObj(i - { if (i start i end) { // 区间内倒序取值 return origin.get(end - 1 - (i - start)); } else { // 区间外保留原值 return origin.get(i); } }) .collect(Collectors.toList()); System.out.println(result); // [1, 4, 3, 2, 5] System.out.println(origin); // 原列表不变 } }总结选型追求性能、通用、可复用→ 双指针手动交换方案 1代码简洁、快速实现→subList Collections.reverse方案 2不修改原集合、函数式风格→ Stream 写法方案 3。