这篇文章主要介绍使用Java集合类List有什么需要注意的,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
坚守“ 做人真诚 · 做事靠谱 · 口碑至上 · 高效敬业 ”的价值观,专业网站建设服务10余年为成都楼梯护栏小微创业公司专业提供成都定制网页设计营销网站建设商城网站建设手机网站建设小程序网站建设网站改版,从内容策划、视觉设计、底层架构、网页布局、功能开发迭代于一体的高端网站建设服务。例如我们执行以下代码:
Liststrings = Arrays.asList("m", "g"); strings.add("h");
会抛出java.lang.UnsupportedOperationException
异常,此时你内心 OSwhat?明明返回的 ArrayList 为啥不能往里面增加元素,这以后还能好好的增加元素吗?
,然后果断开启Debug
大法:
发现返回的ArrayList
并不是我们常用的java.util.ArrayList
,而是Arrays
的内部类java.util.Arrays.ArrayList
。进入方法Arrays.asList
源码如下:
public staticList asList(T... a) { return new ArrayList<>(a); }
方法返回的是Arrays
的静态内部类java.util.Arrays.ArrayList
,该类虽然和java.util.ArrayList
也继承自抽象类java.util.AbstractList
,但是通过该类的源码发现它并没有对抽象父类AbstractList
的add
方法默认就是抛出java.lang.UnsupportedOperationException
异常。
这个坑的根本原因是我们调用返回的strings
的add
方法是继承自抽象父类的add
方法,而抽象父类的方法默认就是抛出java.lang.UnsupportedOperationException
这个异常。
Arrays.asList
方法除了上面这个不支持增加、删除元素 这个坑之外,还有另外一个坑:
从以上代码可以发现,对原始数组的修改会影响我们通过Arrays.asList
方法获得的新List
,深入java.util.Arrays.ArrayList
的源码:
private static class ArrayListextends AbstractList implements RandomAccess, java.io.Serializable { private static final long serialVersionUID = -2764017481108945198L; private final E[] a; ArrayList(E[] array) { a = Objects.requireNonNull(array); } ... }
可以发现是直接使用了原始的数组,所有当我们使用Arrays.asList
方式获得的List
时要特别注意,因为共享了数组,相互修改时可能产生一些意想不到的 Bug。标准的姿势之一是将其作为ArrayList
构造方法的参数重新new
一个List
出来即可(e.g.List
)或者通过Guava
库中的Lists.newArrayList
,将返回的新List
和原始的数组解耦,就不会再互相影响了。
在直接遍历集合元素时增加、删除元素会报错,比如执行如下代码:
ListstringList = Lists.newArrayList("m", "g", "h"); for (String s : stringList) { if (Arrays.asList("m", "h").contains(s)) { stringList.remove(s); } }
以上代码可以正常编译通过,但是执行时会抛出java.util.ConcurrentModificationException
异常,查看其源码可以发现,删除元素方法remove
会使集合结构发生修改,也就是modCount(
集合实际修改的次数)会修改,在循环过程中,会比较当前List
的集合实际修改的次数modCount
与迭代器修改的次数expectedModCount
,而expectedModCount
是初始化时的modCount
, 二者不相等,就会报ConcurrentModificationException
异常。解决方法主要有两种方式,1.使用ArrayList
的迭代器方式遍历,然后调用其中的方法。2.在 JDK 1.8+ 可以使用removeIf
方法进行删除操作。
以上是“使用Java集合类List有什么需要注意的”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联行业资讯频道!