现在的一些高级编程语言提供了各种现成的数据结构实现。 Java编程语言的集合框架提供了多种实现。 集合类包含两个大类: Map和Collection。 其中,Collection下的列表是我们常用的集合类之一,很多业务代码都离不开。 今天我们来看看列表中的漏洞。
第一个坑: Arrays.asList方法返回的List不支持添加/删除操作
例如,执行以下代码:
liststrings=Arrays.aslist('m ',' g ' );
strings.add('h );
抛出Java.lang.unsupportedoperationexception异常时,你内心操作系统OS what? 返回的ArrayList为什么不能在里面增加元素,以后还能好好增加元素吗? 然后下定决心打开调试大法:
我们发现返回的ArrayList是Arrays的内部类java.util.Arrays.ArrayList,而不是我们常用的java.util.ArrayList。 方法要访问Arrays.asList源代码,请执行以下操作:
publicstaticlistaslist(t.a ) {
返回新阵列列表(a;
}
方法返回Arrays的静态内部类java.util.Arrays.ArrayList。 我们发现此类和java.util.ArrayList继承自抽象类java.util.AbstractList,但未从该类的源代码继承到抽象父类Ablist
此孔的根本原因是返回的strings add方法调用从抽象父类继承的add方法,而抽象父类的方法缺省情况下称为Java.lang.unsupportedoperationexception
第二个坑受Arrays.asList方法返回的新List以及该方法的原始参数集的更改的影响
除了上述不支持添加/删除元素的坑之外,Arrays.asList方法还有一个坑:
从上面的代码中可以看到,对原始数组的更改会影响通过Arrays.asList方法获得的新List,并深入到java.util.Arrays.ArrayList的源代码中。
隐私保护角色列表
实施随机访问,java.io.Serializable
{
privatestaticfinallongserialversionuid=-2764017481108945198 l;
私人财务e [ ] a;
阵列列表(e [ ]阵列) {
a=objects.requirenonnull(Array );
}
.
}
可以看出原样使用了原来的数组。 使用以Arrays.asList方式获得的所有List时,请特别注意。 由于共享数组,因此相互修改可能会导致意外错误。 一种标准姿势是将其作为ArrayList构建方法的参数来新更新List即可(e.g.liststringlist=new ArrayList (Arrays.as list ) arrays ) )
如果直接遍历List集合并删除元素,则第三个坑会出错
如果在直接遍历集合元素时添加或删除元素,则会报告错误,如执行以下代码:
liststringlist=lists.new ArrayList (' m '、' g '、' h ' );
for (strings :字符串列表) {
if(Arrays.aslist('m ',' h ' ).contains(s ) ) }
stringlist.remove(s;
}
}
上述代码可以成功编译,但在运行时抛出Java.util.concurrentmodificationexception异常。 查看其源代码时,删除元素方法remove将更改集合结构。 也就是说,modCount (集合实际更改的次数)将发生更改。 循环进程将当前列表集合实际修改的次数modCount与迭代器修改的次数expectedModCount进行比较,但expectedModCount是初始化时的modCount,如果两者不相等,则coctedmodcount 解决方法主要有两种。 使用ArrayList迭代方法进行遍历,并调用其中的方法。 在JDK 1.8中,可以使用removeIf方法执行删除操作。
最后,调用ArrayList的remove方法传递int基本类型的数字和Integer包类型的数字,执行结果是否相同?
到这里为止,详细解说了Java集合系List的关于这个坑的报道就介绍到这里了。 有关更多相关Java List集合类坑的内容,请搜索脚本存储中的以前文章或继续查看以下相关文章。 今后也想继续支持脚本房屋。