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.pswp.cn/news/917486.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917486.shtml
英文地址,请注明出处:http://en.pswp.cn/news/917486.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

克罗均线策略思路

一个基于移动平均线的交易策略&#xff0c;主要通过比较不同周期的移动平均线来生成买卖信号。该策略交易逻辑思路和特点&#xff1a;交易逻辑思路1. 多头交易逻辑&#xff1a;- 当当前周期的收盘价高于其4周期移动平均线&#xff0c;并且4周期移动平均线高于9周期移动平均线&a…

Go语言--语法基础7--函数定义与调用--自定义函数

函数是基本的代码块&#xff0c;用于执行一个任务。Go 语言最少有 1 个 main() 函数。你可以通过函数来划分不同功能&#xff0c;逻辑上每个函数执行的是指定的任务。函数声明告诉了编译器函数的名称、返回类型和参数。函数三要素名称 》功能参数 》接口返回值 》结果函数分类内…

Ollama模型库模型下载慢完美解决(全平台)

前言在我们从ollama下载模型时,会发现ollama最开始下载速度很快,能达到10-20MB/s但到了后期,速度就会越来越慢,最终降低到10-20kb/s下载一个模型大多需要1到1.5小时这是因为ollama服务器负荷过大的问题思路如果在下载中终断下载,在用ollama run恢复下载,速度就会又提上去,但3-4…

web:js的模块导出/导入

一般web页面中&#xff0c;html文件通过标签script引用js文件。但是js文件之间的引用要通过import/exprot进行导入/导出&#xff0c;同时还要在html文件中对js文件的引用使用type属性标注。在下面的例子中&#xff0c;html页面<!DOCTYPE html> <html lang"en&quo…

关于Web前端安全防御之安全头配置

一、核心安全头的作用 1. X-Content-Type-Options: nosniff 该响应头用于阻止浏览器对资源的 MIME 类型进行 “嗅探”&#xff08;猜测&#xff09;&#xff0c;强制浏览器严格遵守服务器返回的 Content-Type 头部声明。 风险背景&#xff1a; 浏览器默认会对未明确声明类型…

C++ : 反向迭代器的模拟实现

一、reverse_iterator.h#pragma once namespace txf { //外界传什么类型的iteator&#xff0c;它就用什么iterator 初始化 , list用_list_iterator<T,T&,,T*> ,vector<T> 用T*template<class Iterator,class Ref,class Ptr>//在这个反向迭代器中涉及到…

自动化与配置管理工具 ——SaltStack

一、SaltStack 概述1.1 核心特性SaltStack 是一款开源的自动化运维工具&#xff0c;采用客户端 - 服务器&#xff08;C/S&#xff09;架构&#xff0c;以高效、灵活和可扩展著称。其核心特性包括&#xff1a;高性能架构&#xff1a;基于 ZeroMQ 消息队列&#xff0c;支持大规模…

Rust → WebAssembly 的性能剖析全指南

一、用优化&#xff08;Release&#xff09;构建 ⚡ 务必在做性能测量前使用 优化模式 构建你的 WASM。默认情况下&#xff1a; wasm-pack build → Release 优化wasm-pack build --dev 或 cargo build → Debug&#xff0c;性能大打折扣 优化编译能开启 LLVM 的各项优化和 LT…

第15届蓝桥杯Pthon青少组_国赛_中/高级组_2024年9月7日真题

更多内容请查看网站&#xff1a;【试卷中心 -----> 蓝桥杯----> Python----> 国赛】 网站链接 青少年软件编程历年真题模拟题实时更新 第15届蓝桥杯Pthon青少组_国赛_中/高级组_2024年9月7日真题 一、单选题 第 1 题 单选题 下列运算符中&#xff0c;表示并集的…

【Django】-9- 单元测试和集成测试(上)

一、Django 项目单元 & 集成测试准备 &#x1f447;依赖安装&#xff08;给项目装 “测试小帮手”&#x1f37c;&#xff09;pdm add -d black isort flake8 pytest pytest-django pytest-coverage &#x1f449; 这行命令像在给项目 “采购” 测试工具&#xff1a;black …

VUE-第二季-01

目录 1.Vue程序初体验 1.1 下载并安装vue.js 1.2 第一个Vue程序 1.3 Vue的data配置项 1.4 Vue的template配置项 1.5 Vue实例 和 容器 的关系是&#xff1a;一夫一妻制 2.Vue核心技术 2.0 Vue的模板语法 2.0.1 插值语法 插值语法总结&#xff1a; 2.0.2 指令语法 指…

Android 15 中禁用/启用应用的系统级方法

在 Android 15 的开发中,有时我们需要以系统级权限来控制应用的启用状态。本文将介绍如何使用 PackageManager 来实现应用的禁用和启用功能。 核心方法 在 Android 15 代码中,可以使用以下方法来禁用或启用应用: packageManager.setApplicationEnabledSetting(pkg,Packag…

2025网络工程师技能图谱(附思维导图)

------------比较全面&#xff0c;供学习参考路线图。-----------------------

【ROS2】rclcpp::Node 常用 API

ROS 系列学习教程(总目录) ROS2 系列学习教程(总目录) 目录1. 构造函数2. 节点名称相关3. 获取log对象句柄4. 回调组相关5. Topic发布与订阅6. Service服务端与客户端1. 构造函数 public:Node(const std::string & node_name, const NodeOptions & options NodeOptio…

自动驾驶:技术、应用与未来展望——从开创到全面革新交通出行

一、引言1.1 研究背景与意义在过去的几十年里&#xff0c;随着科技的飞速发展&#xff0c;自动驾驶技术逐渐从科幻小说中的概念走进了现实生活。从最初简单的辅助驾驶功能&#xff0c;到如今高度自动化的自动驾驶系统&#xff0c;这一领域的进步正深刻地改变着我们的出行方式和…

【gradle】插件那些事

文章目录 1. 前言 2. 插件相关介绍 2.1 gradle插件的apply 2.2 引入自定义插件 2.3 常见构建任务 2.4 gradle生命周期 2.5 gradle的惰性属性&可注入的服务 2.6 常见命令 检查依赖树 查看tasks 构建扫描 查看多项目构建的结构 显示所选项目的构建脚本依赖项 指定控制台模式来…

测试平台如何重塑CI/CD流程中的质量协作新范式

测试平台如何重塑CI/CD流程中的质量协作新范式 在DevOps革命席卷全球软件行业的今天&#xff0c;测试的角色正在经历前所未有的转变。传统的"测试最后"模式正在被"测试全程"的新理念所取代&#xff0c;这一转变背后是测试平台与CI/CD流程深度融合带来的质量…

node.js不同环境安装配置

node.js不同环境安装配置 Windows环境安装配置 一、Node.js是什么&#xff1f; ​ Node.js是一个基于Chrome V8引擎的[JavaScript运行环境]。 Node.js使用了一个事件驱动、非阻塞式I/O 的模型&#xff0c;Node.js是一个让JavaScript运行在服务端的开发平台&#xff0c;它让J…

深度学习-读写模型网络文件

模型网络文件是深度学习模型的存储形式&#xff0c;保存了模型的架构、参数等信息。读写模型网络文件是深度学习流程中的关键环节&#xff0c;方便模型的训练、测试、部署与共享。1. 主流框架读写方法&#xff08;一&#xff09;TensorFlow保存模型可以使用 tf.saved_model.sav…

智慧能源管理平台的多层协同控制架构研究

摘要&#xff1a;针对微电网多源异构设备协同难题&#xff0c;提出一种“云-边-端”三层智慧能源管理架构。平台集成数据采集、策略优化与全景分析功能&#xff0c;支持光伏、储能、充电桩等设备的动态调度&#xff0c;通过自适应算法实现防逆流、需量控制及峰谷套利等策略组合…