自定义列表反转方法调用remove(0)抛出UnsupportedOperationException排查
list.remove(0)会抛出UnsupportedOperationException? 嘿,问题出在你创建列表的方式上!你用Arrays.asList(10, 20, 30, 40)生成的列表,并不是我们平时用的java.util.ArrayList——它是java.util.Arrays类内部的一个私有静态类Arrays$ArrayList,这个类是基于传入的原始数组实现的,设计目的只是提供一个列表视图,不支持任何结构性修改操作(比如add、remove、clear)。
具体来说,Arrays$ArrayList继承自AbstractList,而AbstractList中默认的remove(int index)方法就是直接抛出UnsupportedOperationException——因为它假设子类会自行实现修改逻辑,但Arrays$ArrayList并没有重写这个方法,所以当你调用list.remove(0)时,就触发了这个默认实现抛出的异常。
很简单,只需要把Arrays.asList的结果转换成真正的java.util.ArrayList,这样就支持所有列表操作了:
List<Integer> integerList = new ArrayList<>(Arrays.asList(10, 20, 30, 40)); reverse(integerList);
通过new ArrayList<>(...)把视图列表转成可修改的ArrayList,之后你的反转方法就能正常运行了。
另外提一句:你的递归反转方法虽然能实现功能,但效率不算高——每次remove(0)对于ArrayList来说是O(n)操作(需要移动后面所有元素),如果列表元素很多,性能会比较差。可以试试双指针的迭代写法,效率更高还更简洁:
public static <T> void reverse(List<T> list) { int left = 0; int right = list.size() - 1; while (left < right) { // 交换左右指针的元素 T temp = list.get(left); list.set(left, list.get(right)); list.set(right, temp); left++; right--; } }
这种方式只需要O(n)时间,而且不需要修改列表结构,只是交换元素位置,适用性更广(甚至支持那些只允许set操作但不允许add/remove的列表)。
内容的提问来源于stack exchange,提问作者jennifer lawrence

