Java Arrays.asList的三个坑
坑1,用Array.asList转换基础类型数组
代码
@Slf4j public class ArrayAsListDemo { public static void intArrayToList() { int[] arr = {1, 2, 3}; List list = Arrays.asList(arr); log.info("list:{} size:{} class:{}", list, list.size(), list.get(0).getClass()); } }
结果
list:[[I@78cb5849] size:1 class:class [I
size是1…
分析
asList一模版T作为参数
上面的代码其实是等于
所以返回的list只有一个元素,是一个int数组,有三个元素。如下。
log.info(""+ list.get(0).length);//结果是3
结论
不能直接使用 Arrays.asList 来转换基本类型数组
坑2,Arrays.asList 返回的 List 不支持增删操作
代码
public static void putAndRemove() { String[] arr = {"1", "2", "3"}; List<String> list = Arrays.asList(arr); try { list.add("4"); } catch (UnsupportedOperationException ex) { log.info("add failed"); } try { list.remove("1"); } catch (UnsupportedOperationException ex) { log.info("remove failed"); } }
结果
add failed
remove failed
分析
Arrays.asList返回的ArrayList是Array内部的ArrayList
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable
但是AbstractList内部的add和remove没有实现,ArrayList,没有重写add和remove
坑3,对原始数组的修改会直接影响得到的list
代码
public static void modifyOriginal() { String[] arr = {"1", "2", "3"}; List<String> list = Arrays.asList(arr); log.info("list 0 before modify: "+list.get(0)); arr[0]="aaaaa"; log.info("list 0 after modify: "+list.get(0)); }
结果
list 0 before modify: 1
list 0 after modify: aaaaa
分析
asList生成的那个Array内部的ArrayList内部直接使用了原始的array导致的,这估计也是不让生成的list add和remove的原因吧,因为这样会影响到原始值。
原文作者:iBrake
原文地址: https://www.cnblogs.com/Brake/p/12731888.html
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://www.cnblogs.com/Brake/p/12731888.html
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
相关文章