关于java:Java踩坑记系列之ArraysAsList

34次阅读

共计 2046 个字符,预计需要花费 6 分钟才能阅读完成。

java.util.ArraysasList 办法能够不便的将数组转化为汇合,咱们平时开发在初始化 ArrayList 时应用的比拟多,能够简化代码,但这个静态方法 asList() 有几个坑须要留神:

一. 如果对汇合应用减少或删除元素的操作将会报错

如下代码:

List list = Arrays.asList("a","b","c");
list.add("d");

输入后果:

Exception in thread "main" java.lang.UnsupportedOperationException
  at java.util.AbstractList.add(AbstractList.java:148)
  at java.util.AbstractList.add(AbstractList.java:108)
  at ArraysAsListTest.main(ArraysAsListTest.java:7)

Arrays.asList的源码尽管返回的是一个 ArrayList,但这个ArrayListArrays外部的一个动态类 (java.util.Arrays.ArrayList),并不是咱们平时用的java.util.ArrayList 只是名字一样,包名不一样:

这个 ArrayList 也继承自 AbstractList,然而却没有实现add()remove() 办法用这两个办法其实调用的是 AbstractList 的默认办法:

public void add(int index, E element) {throw new UnsupportedOperationException();
}

间接抛出 ” UnsupportedOperationException“ 的异样!

所以当咱们调用这个 ArrayListadd办法时其实是调用了形象汇合类里的 add 办法,就抛出了下面的异样,起因是数组尽管提供了转汇合的办法, 但实质上还是个数组,数组的长度是固定的,所以 jdk 的作者没有实现 add()remove()办法。

大家在应用的时候须要留神,要联合具体业务场景判断:如果只是对转成后的汇合进行遍历或应用 stream()流操作都没有问题,能够失常应用(批改元素也没问题) 但如果须要新增元素或删除元素等扭转汇合长度的操作就要防止,否则报错就会影响到咱们失常的业务逻辑。

二. 长度问题

还是 ArraysasList(),该办法无奈将一个根本类型的数组转换成汇合 List,或者说根本类型尽管能转换胜利,但不是 ” 咱们想要的汇合 ”,因为 asList 办法接管的是一个泛型的变长参数。

而根本数据类型是无奈被泛型化的,这样的话对于泛型而言,根本数据类型会被作为一个 ”[x” 的类型,”[“ 示意这是一个数组,”x” 为以后数组的类型,例如: int[] 实际上它的类型是 ”[I”

这样的话 Arrays.asList 传入的参数是根本类型的话,会把数组当做一个元素解决 (长度 =1),如果咱们要遍历List 或获取 List 的长度就不精确了,相似上面的用法:

int array[] = {1,2,3,4,5};
List list = Arrays.asList(array);
System.out.println("长度 ="+list.size());
System.out.println("是否含有元素 3 ="+list.contains(3));

输入后果:

长度 =1
是否含有元素 3 =false

如果咱们的代码里用到了这样获取长度或判断是否蕴含指定元素的操作就要留神写法,否则就会影响咱们的逻辑流程!

为防止这样的问题呈现,有很多种其余写法,比方将 array 转成包装类(即援用类型),如下:

Integer array[] = {1,2,3,4,5};
List list = Arrays.asList(array);
System.out.println("长度 ="+list.size());
System.out.println("是否含有元素 3 ="+list.contains(3));

输入后果:

长度 =5
是否含有元素 3 =true

当然也能够应用 google 的汇合类 ”Ints.asList”,如下:

int array[] = {1,2,3,4,5};
List list = Ints.asList(array);
System.out.println("长度 ="+list.size());
System.out.println("是否含有元素 3 ="+list.contains(3));

输入后果:

长度 =5
是否含有元素 3 =true

然而 google 的 Ints.asList 办法返回的 list 也是一个本人实现的汇合,同样不反对 addremove办法,如果既要保障转换成 list 后的数据长度正确又要能增删操作的话,就用 java.util.ArrayList 吧。

三. Arrays.asList 办法返回的是数组的一个视图,也就是说对这个 list 的操作都会反映在原数组上

文章起源:http://javakk.com/132.html

正文完
 0