深入浅析Java中列表集合类的一些问题

  介绍

今天就跟大家聊聊有关深入浅析Java中列表集合类的一些问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

<强>第一个坑:数组。asList方法返回的列表不支持增加,删除操作

例如我们执行以下代码:

List字符串=arrays . aslist (“m",“g");   strings.add (“h");

会抛出<代码> . lang。UnsupportedOperationException> 什么?明明返回的ArrayList为啥不能往里面增加元素,这以后还能好好的增加元素吗?> 大调试法:

深入浅析Java中列表集合类的一些问题

发现返回的<代码> ArrayList> java.util。ArrayList> 阵列的内部类<代码> java.util.Arrays。ArrayList> 数组。asList>

公共静态& lt; T>ListasList (T…一){
  返回新ArrayList<祝辞(a);
  }

方法返回的是<代码> 阵列的静态内部类<代码> java.util.Arrays。ArrayList> java.util。ArrayList> java.util。AbstractList> AbstractList 的<代码> 添加方法默认就是抛出<代码> . lang。UnsupportedOperationException>

深入浅析Java中列表集合类的一些问题

这个坑的根本原因是我们调用返回的字符串<代码> 的<代码> 添加方法是继承自抽象父类的<代码> 添加方法,而抽象父类的方法默认就是抛出<代码> . lang。UnsupportedOperationException>

<代码>数组。asList 方法除了上面这个<强>不支持增加,删除元素这个坑之外,还有另外一个坑:

深入浅析Java中列表集合类的一些问题

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

私有静态类ArrayList扩展AbstractList
  实现了RandomAccess, java.io.Serializable
  {
  私有静态最终长serialVersionUID=-2764017481108945198 l;
  私人最终E [];
  
  ArrayList (E[]数组){
  一个=Objects.requireNonNull(数组);
  }
  
  …
  
  }

可以发现是直接使用了原始的数组,所有当我们使用<代码>数组。asList 方式获得的<代码> 列表时要特别注意,因为共享了数组,相互修改时可能产生一些意想不到的错误。标准的姿势之一是将其作为<代码> ArrayList 构造方法的参数重新新的<代码> 一个<代码> 出列表来即可。<代码> ListstringList=new ArrayList<祝辞(arrays . aslist(数组))> 番石榴> 列表。newArrayList> 代码列表和原始的数组解耦,就不会再互相影响了。

在直接遍历集合元素时增加,删除元素会报错,比如执行如下代码:

ListstringList=Lists.newArrayList (“m",“g",“h");   (字符串s: stringList) {   如果(arrays . aslist ()“m",“h" .contains (s)) {   stringList.remove(年代);   }   }

以上代码可以正常编译通过,但是执行时会抛出<代码> java.util。ConcurrentModificationException 异常查,看其源码可以发现,删除元素方法<代码>删除> modCount(> 代码列表的集合实际修改的次数<代码> modCount> expectedModCount> expectedModCount> modCount> ,<代码> ConcurrentModificationException异常。解决方法主要有两种方式,1。使用<代码> ArrayList> removeIf 方法进行删除操作。

深入浅析Java中列表集合类的一些问题