2021-08-02 11:47:58
Collections.reverse() 是 Java 中用于原地反转列表元素顺序的静态方法,直接修改原列表且不返回新列表,时间复杂度为 O(n)。
核心特性与用法方法签名:public static void reverse(List<?> list)
参数:任意实现了 List 接口的可变列表(如 ArrayList、LinkedList)。
返回值:void,直接修改原列表,无返回值。
操作效果:
示例中字符串列表 [Alice, Bob, Charlie] 反转后变为 [Charlie, Bob, Alice]。
自定义对象列表(如 Person 类实例)同样适用,需确保列表可修改。
可变性要求:
列表必须可修改,否则抛出 UnsupportedOperationException。
不可变列表(如通过 Collections.unmodifiableList() 创建)或固定大小列表(如 Arrays.asList() 直接创建的列表)不支持反转。
解决方案:若需保留原列表,先复制再反转:List<String> original = Arrays.asList("a", "b", "c"); List<String> reversed = new ArrayList<>(original); Collections.reverse(reversed);
性能与复杂度:
时间复杂度为 O(n),通过双指针交换元素实现,性能高效。
空间复杂度为 O(1),无需额外存储空间(原地操作)。
适用场景:
支持所有实现 List 接口的集合类,包括 ArrayList、LinkedList、Vector 等。
适用于需要快速反转列表且不介意修改原数据的场景。
问题1:反转后原列表被修改,如何保留原数据?
解决:创建新列表副本(如 new ArrayList<>(originalList))后再反转。
问题2:对 Arrays.asList() 创建的列表反转失败?
原因:Arrays.asList() 返回的列表大小固定,不可增删元素(但可修改已有元素)。
解决:转换为 ArrayList 或 LinkedList:List<String> fixedList = Arrays.asList("a", "b", "c"); List<String> modifiableList = new ArrayList<>(fixedList); Collections.reverse(modifiableList);
Collections.reverse() 是 Java 中高效、简洁的列表反转工具,适用于大多数可变列表场景。使用时需确保列表可修改,若需保留原数据需提前复制。其 O(n) 的时间复杂度和原地操作特性使其在性能敏感场景中表现优异。