You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义列表反转方法调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:58:11