asList和ArrayList不得不说的故事

简介: asList和ArrayList不得不说的故事

目录



asList和ArrayList不得不说的故事


简介


提到集合类,ArrayList应该是用到的非常多的类了。


这里的ArrayList是java.util.ArrayList,通常我们怎么创建ArrayList呢?


创建ArrayList


看下下面的例子:


List<String> names = new ArrayList<>();


上面的方法创建了一个ArrayList,如果我们需要向其中添加元素的话,需要再调用add方法。


通常我们会使用一种更加简洁的办法来创建List:


@Test
    public void testAsList(){
        List<String> names = Arrays.asList("alice", "bob", "jack");
        names.add("mark");
    }


看下asList方法的定义:


public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }


很好,使用Arrays.asList,我们可以方便的创建ArrayList。


运行下上面的例子,奇怪的事情发生了,上面的例子居然抛出了UnsupportedOperationException异常。


java.lang.UnsupportedOperationException
  at java.util.AbstractList.add(AbstractList.java:148)
  at java.util.AbstractList.add(AbstractList.java:108)
  at com.flydean.AsListUsage.testAsList(AsListUsage.java:18)


UnsupportedOperationException


先讲一下这个异常,UnsupportedOperationException是一个运行时异常,通常用在某些类中并没有实现接口的某些方法。


为什么上面的ArrayList调用add方法会抛异常呢?


asList


我们再来详细的看一下Arrays.asList方法中返回的ArrayList:


private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable


可以看到,Arrays.asList返回的ArrayList是Arrays类中的一个内部类,并不是java.util.ArrayList。


这个类继承自AbstractList,在AbstractList中add方法是这样定义的:


public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }


好了,我们的问题得到了解决。


转换


我们使用Arrays.asList得到ArrayList之后,能不能将其转换成为java.util.ArrayList呢?答案是肯定的。


我们看下下面的例子:


@Test
    public void testList(){
        List<String> names = new ArrayList<>(Arrays.asList("alice", "bob", "jack"));
        names.add("mark");
    }


上面的例子可以正常执行。


总结


在java中有很多同样名字的类,我们需要弄清楚他们到底是什么,不要混淆了。


本文的例子https://github.com/ddean2009/learn-java-collections

相关文章
|
3月前
|
存储 Java 索引
《令狐带你阅读JDK源码之简单集合ArrayList》
《令狐带你阅读JDK源码之简单集合ArrayList》
40 0
|
1月前
|
存储 Java 程序员
ArrayList 和 LinkedList 谁更适合你的项目?这篇文章告诉你!
大家好!我是小米,今天来分享 ArrayList 和 LinkedList 的区别。通过对比它们的特点和适用场景,帮助你在实际开发中做出最优选择。ArrayList 适用于查询频繁的场景,而 LinkedList 则在插入和删除操作较多时更胜一筹。希望今天的分享对你有帮助!我是小米,下次再见!
41 1
|
3月前
|
存储 Java
Map大揭秘:HashMap与TreeMap背后的故事,你听过吗?
Map大揭秘:HashMap与TreeMap背后的故事,你听过吗?
36 1
|
3月前
|
安全 Java 程序员
Java集合之战:ArrayList vs LinkedList,谁才是你的最佳选择?
本文介绍了 Java 中常用的两个集合类 ArrayList 和 LinkedList,分析了它们的底层实现、特点及适用场景。ArrayList 基于数组,适合频繁查询;LinkedList 基于链表,适合频繁增删。文章还讨论了如何实现线程安全,推荐使用 CopyOnWriteArrayList 来提升性能。希望帮助读者选择合适的数据结构,写出更高效的代码。
145 3
|
7月前
杨老师带你深入研究ArrayList和LinkedList的区别不同
杨老师带你深入研究ArrayList和LinkedList的区别不同
44 0
|
7月前
|
Java 索引
那些年,我们追过的Java List——ArrayList与LinkedList的爱恨情仇
【6月更文挑战第17天】ArrayList与LinkedList,Java List接口的双子星,各有千秋。ArrayList基于数组,随机访问快速,但插入删除慢;LinkedList用链表实现,插入删除高效,但索引访问慢。两者在爱恨情仇中教会我们权衡选择,成为编程旅程中难忘的记忆。 ```
31 0
|
7月前
|
存储 Java
深入Java List:探寻有序集合背后的故事
【6月更文挑战第17天】Java List接口,作为有序集合,用于数据存储与处理。ArrayList和LinkedList是常见实现类:ArrayList基于数组,适合随机访问但插入删除慢;LinkedList基于链表,插入删除快但随机访问效率低。在需要频繁在开头插入元素并高效访问时,应选用LinkedList。了解这些原理能帮助优化代码性能。
45 0
|
8月前
|
存储 Java 索引
[AIGC] ArrayList介绍
[AIGC] ArrayList介绍
|
缓存 Java 编译器
一文颠覆你对 ArrayList 和 LinkedList 的认知
在初学Java的时候我们经常能看到这么一句话:ArrayList增删慢查询快,LinkedList增删快查询慢。但随着学习的不断深入,我们会发现这句话并不对,初学时看到这句话主要还是为了新手友好。
263 0
一文颠覆你对 ArrayList 和 LinkedList 的认知
面试基础篇——ArrayList VS LinkedList
面试基础篇——ArrayList VS LinkedList
91 0
面试基础篇——ArrayList VS LinkedList