当前位置: 首页 > 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.xdnf.cn/news/1236889.html

相关文章:

  • 常见的深度学习模块/操作中的维度约定(系统性总结)
  • 接口测试用例的编写
  • Java 大视界 -- Java 大数据机器学习模型在金融市场情绪分析与投资决策辅助中的应用(379)
  • WSUS服务器数据库维护与性能优化技术白皮书
  • Nvidia Orin + RealSense D435i 与3D地图实现导航
  • ulimit参数使用详细总结
  • 第九章:了解特殊场景下的redis
  • 推荐系统学习笔记(八)其他召回通道
  • 机器人抓取流程介绍与实现——机器人抓取系统基础系列(七)
  • 《人形机器人的觉醒:技术革命与碳基未来》——类人关节设计:人工肌肉研发进展及一款超生物肌肉Hypermusclet的设计与制造
  • 最小半径覆盖问题【C++解法+二分+扫描线】
  • 从零开始学Express,理解服务器,路由于中间件
  • 批发订货系统:私有化部署与源代码支持越来越受市场追捧
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-56,(知识点:电源模块,DCDC电源,LDO电源,原理及其特点)
  • CVE-2025-5947 漏洞场景剖析
  • SpringBoot3.x入门到精通系列:2.5 整合 MyBatis 详解
  • 井盖识别数据集-2,700张图片 道路巡检 智能城市
  • [硬件电路-134]:模拟电路 - 运算放大器常见运算:两模拟信号相加、相减、单模拟信号的积分、微分...
  • 如新能源汽车渗透率模拟展开完整报告
  • 老电脑PE下无法读取硬盘的原因
  • node.js常用函数
  • 【代码详解】Triplane Meets Gaussian Splatting中triplane部分解析
  • Nvidia Orin DK 刷机CUDA TensorRT+硬盘扩容+ROS+Realsense+OpenCV+Ollama+Yolo11 一站式解决方案
  • Unity_数据持久化_XML序列化与反序列化
  • Dify中自定义工具类的类型
  • 服务器中切换盘的操作指南
  • 更换KR100门禁读头&主机
  • Redis+Lua的分布式限流器
  • 专网内网IP攻击应急与防御方案
  • 专网内网IP攻击防御:从应急响应到架构加固