首页 > 其他分享 >关于Arrays.asList返回List无法新增和删除?

关于Arrays.asList返回List无法新增和删除?

时间:2024-08-22 14:16:26浏览次数:9  
标签:Arrays ArrayList List add 集合 asList

关于Arrays.asList返回的List无法新增和删除?

这个是在写项目的时候发现的,然后就分析了一下源码,得其内部原理

复现代码示例:

public class ArraysAsList {
    public static void main(String[] args) {
        Integer[] array = {1, 2, 3, 4, 5};
        List<Integer> list = Arrays.asList(array);
        list.forEach(System.out::println);
        list.add(11);
    }
}

程序运行至list.add(11)时报错

Exception in thread "main" java.lang.UnsupportedOperationException

分析源码:

点击查看Arrays.asList源码,静态的返回 List 的方法

image-20240822092303194

看一下asList里面 new ArrayList的代码实现,就会发现这里的ArrayList并不是java.util.ArrayList中的单列集合,而是Arrays工具类(java.util.Arrays)中的静态内部类ArrayList

image-20240822090509143

image-20240822091109703

然后回归到Arrays.asList()方法,为什么这个方法生成的List集合无法在add和remove

因为这里返回的是一个 final 数组,数组本身就是不可变的,所以当调用Arrays.asList方法返回一个集合后,无法在对这个集合进行一些操作,这个是数组的特性

private final E[] a;

ArrayList(E[] array) {
    a = Objects.requireNonNull(array);
}

至于为什么java.util包下的ArrayList的底层也是数组,但是它依然可以去add和remove,那是因为copy了,但是在Arrays下面的ArrayList静态内部类中,它并没有实现add和remove方法用来对集合进行添加和删除,看下图:

image-20240822091617505

也就是说我们可以调用get方法得到Arrays.asList返回的集合元素,也可以set修改这里面的值,但是因为它没有add和remove方法所以无法对集合进行增加和删除,这也是为什么会报错:UnsupportedOperationException(没有支持的方法)的原因。

至此我认为Arrays.asList的问题就讲完了,但是在写这个示例的时候我发现了一个新的知识函数式接口,之前了解过,但是不是很熟悉。

如果你是为了明白Arrays.asList的问题,那么到这里就可以止步了。

标签:Arrays,ArrayList,List,add,集合,asList
From: https://www.cnblogs.com/zhiliu/p/18373725

相关文章

  • 织梦dedeCMS怎么使用arclist标签调用自定义字段
    {dede:arclistrow='10'titlelen='24'orderby='pubdate'idlist=''col='2'}[field:textlink/]([field:pubdatefunction=MyDate('m-d',@me)/])<br/>{/dede:arclist}row=‘10’返回文档列表总数typeid=‘’栏目ID......
  • 掌握C++中的std::list:高效处理插入与删除的最佳选择
    在C++标准模板库(STL)中,std::list是一个非常重要的容器,属于序列式容器。与std::vector和std::deque不同,std::list是一个双向链表(doublylinkedlist),其设计更适合于频繁的插入和删除操作,而不是随机访问。本文将深入探讨std::list的实现原理、使用场景以及与其他容器的对比......
  • python 计算list的方差
    python计算list的方差 importnumpyasnp#假设我们有一个包含数值的列表data=[1,2,3,4,5]#计算均值mean=np.mean(data)#计算方差variance=np.var(data)#这将使用默认的N-1作为分母(样本方差)#如果你想要总体方差(使用N作为分母),可以传入ddof=0#var......
  • 数据结构之跳表SkipList、ConcurrentSkipListMap
    概述SkipList,跳表,跳跃表,在LevelDB和Lucene中都广为使用。跳表被广泛地运用到各种缓存实现当中,跳跃表使用概率均衡技术而不是使用强制性均衡,因此对于插入和删除结点比传统上的平衡树算法更为简洁高效。Skiplistsaredatastructuresthatuseprobabilisticbalancingrather......
  • Tech Stack Checklist
    从4个方面描述推荐使用的软件、技术和云服务,如果引入新的或改用其他版本,请联系各自团队的架构和开发负责人进行讨论,并对改列表进行更新说明引入的考虑和主要原因。OpenSourcesEnterpriseSoftware/SaaSCategorySub-categorySoftware/SaaSDetailedVersionGuidelines/......
  • Netty 异步任务模型 及 Future-Listener 机制
    https://cloud.tencent.com/developer/article/2246990一、Netty模型二、异步模型三、Future-Listener机制四、Future-Listener机制代码示例 以服务器端为例1.线程池:Netty模型核心就是两个线程池,BossGroup线程池和WorkerGroup线程池;①BossGroup......
  • forward_list
    forward_listforward_list容器以单链表的形式存储元素。forward_list的模板定义在头文件forward_list中。fdrward_list和list最主要的区别是:它不能反向遍历元素;只能从头到尾遍历。forward_list的单向链接性也意味着它会有一些其他的特性:无法使用反向迭代器。只能从它......
  • list
    listlist<T>容器模板定义在list头文件中,是T类型对象的双向链表。list容器具有一些vector和deque容器所不具备的优势,它可以在常规时间内,在序列已知的任何位置插入或删除元素。这是我们使用list,而不使用vector或deque容器的主要原因。list的缺点是无法通过位置来......
  • TreeView和ListView数据库查询数据联动操作
    好久不用了,重新整理下放这里以备需要使用,功能见图数据库表结构定义TreeViewaddObject中data存储的记录集typePNode=^TNode;TNode=recordid:Integer;tcmc:string;mxid:string;end;填充TreeView代码procedureTForm1.FillTree(TreeV......
  • C++第十一弹 -- STL之List的剖析与使用
    文章索引前言1.list的介绍2list的使用2.1list的构造函数2.2iterator的使用2.3listcapacity2.4listelementaccess2.5listmodifiers3.list的迭代器失效4.list与vector的对比总结前言本篇我们旨在探讨对于STL中list的使用,下一篇我们将会对list进行底层......