我们都知道可以将一个数组直接转换为List,而且可以实现集合List的初始化,但是这里有个坑哦,直接上代码
import java.util.Arrays; import java.util.List; public class TestClient { public static void main(String[] args) { Num[] numArr = {Num.ONE,Num.TWO,Num.THREE}; List<Num> numList = Arrays.asList(numArr); System.out.println(numList); numList.add(Num.FOUR); System.out.println(numList); } } enum Num{ ONE,TWO,THREE,FOUR,FIVE }
运行结果如下:
[ONE, TWO, THREE]
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at testpro.TestClient.main(TestClient.java:12)
这里就很奇怪了,为什么我的List进行add元素的时候会报错呢???
其实问题很简单,看看Arrays.asList()方法代码就可以了解了,这里生成的list不是我们熟悉的ArrayList类型,而是Arrays工具类的一个静态内部类,就不一一贴代码了,可以自己去看,没有实现add方法,可操作的只有size(),toArray(),get(),set(),contains()五个方法。所以执行add方法就抛异常了。
我们改写一下:
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class TestClient { public static void main(String[] args) { Num[] numArr = {Num.ONE,Num.TWO,Num.THREE}; List<Num> numList = Arrays.asList(numArr); List<Num> numList2 = new ArrayList<>(); numList2.add(Num.ONE); numList2.add(Num.TWO); System.out.println(numList2); } } enum Num{ ONE,TWO,THREE,FOUR,FIVE }
执行结果:
[ONE, TWO]
可以看到一切正常。
所以呢,如果用如下代码进行集合的创建和初始化:
List<String> strList = Arrays.asList(“tom”,“jack”,“tony”);
虽然很方便,但是如果后续代码逻辑中如果有add操作,就是一个大雷,而且这个在编译的时候是没有问题的,所以用这个要慎之又慎。
谨以此博,提醒自己有此坑,要跳过。