Javalist集合,java定义一个list集合

  Javalist集合,java定义一个list集合

  java基础教程栏目介绍集合类包含 Map 和 Collection 两个大类

  如何解决写爬虫IP受阻的问题?立即使用。

  推荐(免费):java基础教程

  如今,一些高级编程语言将提供开箱即用的各种数据结构的实现。例如,Java编程语言在其集合框架中提供了各种实现。集合类包括Map和Collection,其中Collection下面的列表是我们经常使用的集合类之一,很多业务代码离不开它。今天我们来看看榜单的一些坑。

  

第一个坑:Arrays.asList 方法返回的 List 不支持增加、删除操作

  例如,我们执行以下代码:

  ListString strings=arrays . aslist( m , g );

  strings . add( h );会扔Java。郎。UnsupportedOperationException异常,而你的内心是什么?为什么返回的ArrayList不能给它添加元素?以后能不能好好添加元素?然后果断打开调试方案:

  返回的ArrayList不是我们常用的java.util.Arrays.ArrayList,而是Arrays的内部类java.util.ArrayList,输入Arrays.asList的源代码如下:

  公共静态测试列表asList(T.a) {

  返回新的数组列表(a);

  }方法返回数组的静态内部类java.util.Arrays.ArrayList。虽然这个类和java.util.ArrayList也是继承自抽象类java.util.AbstractList,但是通过这个类的源代码发现,对于抽象父类AbstractList的add方法,它并没有默认抛出java.lang.unsupported操作的异常。

  这个坑的根本原因是我们调用返回的字符串的add方法继承了抽象父类的add方法,默认抛出异常java.lang.unsupported操作异常。

  

第二个坑,Arrays.asList 方法返回的新 List 和该方法原始入参数组修改会相互影响

   Arrays.asList方法除了上述不支持增加、删除元素的pit之外,还有另一个pit:

  从上面的代码可以发现,对原数组的修改会影响我们通过Arrays.asList方法得到的新列表。深入java.util.Arrays.ArrayList的源代码:

  私有静态类ArrayListE扩展AbstractListE

  实现RandomAccess,java.io.Serializable

  {

  private static final long serial version uid=-2764017481108945198 l;

  私人决赛E[]a;

  ArrayList(E[] array) {

  a=objects . require nonnull(array);

  }

  .

  }可以发现直接使用的是原数组,所以在使用Arrays.asList获取列表时要特别注意,因为我们是共享数组的,相互修改可能会产生一些意想不到的bug。其中一个标准的手势就是用它作为ArrayList构造方法的参数来重新创建一个列表(例如Liststring string List=new ArrayList(arrays。aslist (arrays))),或者通过Guava库中的Lists.newArrayList将返回的新列表与原数组解耦,使它们不再相互影响。

  

第三个坑,直接遍历 List 集合删除元素会报错

  直接遍历集合中的元素时,添加或删除元素会产生错误,如执行以下代码:

  ListString string list=lists . new ArrayList( m , g , h );

  for (String s : stringList) {

  if (Arrays.asList(m , h )。包含(s)) {

  stringList.remove

  }

  }以上代码可以正常编译通过,但是执行时会抛出异常Java . util . concurrent modification异常。看它的源代码可以发现,删除元素方法remove会修改集合的结构,也就是修改modCount(集合实际被修改的次数)。在循环期间,将当前列表集ModCount的实际修改时间与迭代器修改时间expectedModCount进行比较,expectedModCount是初始化时的modCount。如果两者不相等,将会报告异常。解决问题的方法主要有两种:1。通过ArrayList的迭代器遍历,然后调用方法。2.在JDK 1.8中,可以使用removeIf方法删除。

  最后我问:调用ArrayList的remove方法传入int基本类型的个数和整数包装类型的个数。执行结果一样吗?以上是Java集合类列表的坑的详细情况。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: