当前位置: 首页 > news >正文

Arrays.asList() add方法报错java.lang.UnsupportedOperationException

1. 问题说明

记录一下遇到的这个bug,下面是段个简化后的问题重现代码。

public class Test {public static void main(String[] args) {List<Integer> list = Arrays.asList(1, 2, 3);list.add(4);}
}

在这里插入图片描述

2. 原因分析

我们看一下Arrays.asList(…) 的源码:

/*
- Returns a fixed-size list backed by the specified array. Changes made to the array will be visible in the returned list, and changes made to the list will be visible in the array. The returned list is Serializable and implements RandomAccess.
- The returned list implements the optional Collection methods, except those that would change the size of the returned list. Those methods leave the list unchanged and throw UnsupportedOperationException.
- If the specified array's actual component type differs from the type parameter T, this can result in operations on the returned list throwing an ArrayStoreException.
*/
@SafeVarargs
/varargs/
public static <T> List<T> asList(T... a) {return new ArrayList<>(a);
}
//  上面的 return new ArrayList<>(a)中的ArrayList源码
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable { // ... 
}

从方法上给出的注释信息中的第2条可以知道,返回的其实是 java.util.Arrays$ArrayList(也就是一个内部类,并不是 java.util.ArrayList)。它内部基于数组实现,只能固定大小,不支持 add()addAll()remove() 等结构性操作 。如果如果你需要一个可变、可以添加或删除元素的列表,请用:

List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
list.add(3); // 安全可行

3. 补充说明

  • 在高并发或多线程环境下,如果基础数组发生变化,Arrays.asList 返回的列表内容也会变化,可能引发数据不一致。
  • List.of(...)(Java 9+)是完全不可变的列表,任何变结构操作都会立即抛异常;而 Arrays.asList 是“可修改元素但不可改大小”。
    在这里插入图片描述
http://www.dtcms.com/a/313132.html

相关文章:

  • 8月3日星期日今日早报简报微语报早读
  • 多线程(四) ~ wait,join,sleep及单例与工厂模式
  • 图像识别区分指定物品与其他物体
  • 【华为机试】815. 公交路线
  • NumPy库学习(三):numpy在人工智能数据处理的具体应用及方法
  • 机器学习sklearn:支持向量机svm
  • Vue3 其它Composition API
  • Linux网络编程 --- 多路转接select
  • 推送本地项目到Gitee远程仓库
  • Selenium Web 自动化
  • 优选算法 力扣 202.快乐数 快慢双指针 解决带环问题 C++解题思路 每日一题
  • ThinkPHP5x,struts2等框架靶场复现
  • Coin Combinations II(Dynamic Programming)
  • LLM - AI大模型应用集成协议三件套 MCP、A2A与AG-UI
  • 用 Eland 在 Elasticsearch Serverless 部署 Learning-to-Rank 排序模型
  • 数据,正在成为AI大模型最后的护城河
  • leetcode 2106. 摘水果 困难
  • Rust 同步方式访问 REST API 的完整指南
  • 道格拉斯-普克算法 - 把一堆复杂的线条变得简单,同时尽量保持原来的样子
  • python---赋值、浅拷贝、深拷贝
  • 【C 学习】03-你的第一个C程序
  • 上位机知识篇---脚本文件
  • Linux环境下使用Docker搭建多服务环境
  • Corrosion2靶场
  • xxljob总结
  • Obsidian结合CI/CD实现自动发布
  • 1、docker容器命令 | 生命周期管理
  • NX969NX972美光固态闪存NX975NX977
  • python 12 install jupyter时zmq.h或libzmq报错处理
  • MVCC:数据库事务隔离的 “时空魔法”