目录
一、需求说明
1. 原生手动交换(最通用,推荐)
2. 借助 Collections 工具类(简洁)
关键注意点
3. Java 8 Stream 写法(不修改原列表,返回新集合)
总结选型
这里介绍 Java 中List 局部反转的几种常用实现,包含原生写法、工具类、流式写法,适配ArrayList/LinkedList等常规 List。
一、需求说明
指定起始下标 start、结束下标 end(左闭右开[start, end)),反转区间内元素。 例:[1,2,3,4,5],start=1, end=4→ 结果[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(List<T> 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) { List<Integer> 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) { List<Integer> list = new ArrayList<>(List.of(1,2,3,4,5)); int start = 1; int end = 4; // 截取子列表并反转 List<Integer> 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) { List<Integer> origin = new ArrayList<>(List.of(1,2,3,4,5)); int start = 1; int end = 4; List<Integer> 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)。