Java Arrays.asList注意事项
Arrays.asList用來將數組轉化為List,這個看似功能很明了的方法卻暗藏玄機。
請先看下面的程序:
int[] datas = new int[]{1,2,3,4,5}; List list = Arrays.asList(datas); System.out.println(list.size());運行結果是1。一個長度為5的數組,轉化為List后,長度卻成了1。
再對這個程序稍加修改:
Integer[] datas = new Integer[]{1,2,3,4,5}; List list = Arrays.asList(datas); System.out.println(list.size());運行結果為5。
同樣的代碼,只是將數組的類型由原來的基本類型改變為包裝類型,轉化后的List卻不一樣,這是為什么?
看一下asList的代碼:
public static <T> List<T> asList(T... a) {return new ArrayList<>(a); }asList接受的是一個泛型類型的參數,再構造了一個ArrayList。然而基本類型是不支持泛型化的,但是數組支持,所以采用基本類型的數組轉化后是將數組放入了構造的ArrayList中,長度是1。
再接著看,這個坑過去了,興高采烈的想要往轉化后的List中添加些元素:
Integer[] datas = new Integer[]{1,2,3,4,5}; List list = Arrays.asList(datas); list.add(6);然后運行后卻拋出了java.lang.UnsupportedOperationException異常,
Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at java.util.AbstractList.add(AbstractList.java:108) at com.cxm.demo.DemoMain.main(DemoMain.java:11)這是怎么回事?
原來asList返回的ArrayList并不是我們熟悉的java.util.ArrayList,而是另一個類:
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable
抽象類AbstractList 定義了一系列比如add()、remove()修改list的方法,然而在這個ArrayList中并沒有實現它們,所以返回的ArrayList是不支持修改操作的。
那么如果想要對其進行add或者remove應該怎么做呢?
Integer[] datas = new Integer[]{1,2,3,4,5}; ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(datas));?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Java Arrays.asList注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 很慌!一次惊心动魄的服务器误删文件的恢复
- 下一篇: 一次 Java 内存泄漏排查过程,学习学