坑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的原因吧,因為這樣會影響到原始值。