Java Arrays.asList注意事项
Arrays.asList用來將數(shù)組轉(zhuǎn)化為List,這個(gè)看似功能很明了的方法卻暗藏玄機(jī)。
請先看下面的程序:
int[] datas = new int[]{1,2,3,4,5}; List list = Arrays.asList(datas); System.out.println(list.size());運(yùn)行結(jié)果是1。一個(gè)長度為5的數(shù)組,轉(zhuǎn)化為List后,長度卻成了1。
再對這個(gè)程序稍加修改:
Integer[] datas = new Integer[]{1,2,3,4,5}; List list = Arrays.asList(datas); System.out.println(list.size());運(yùn)行結(jié)果為5。
同樣的代碼,只是將數(shù)組的類型由原來的基本類型改變?yōu)榘b類型,轉(zhuǎn)化后的List卻不一樣,這是為什么?
看一下asList的代碼:
public static <T> List<T> asList(T... a) {return new ArrayList<>(a); }asList接受的是一個(gè)泛型類型的參數(shù),再構(gòu)造了一個(gè)ArrayList。然而基本類型是不支持泛型化的,但是數(shù)組支持,所以采用基本類型的數(shù)組轉(zhuǎn)化后是將數(shù)組放入了構(gòu)造的ArrayList中,長度是1。
再接著看,這個(gè)坑過去了,興高采烈的想要往轉(zhuǎn)化后的List中添加些元素:
Integer[] datas = new Integer[]{1,2,3,4,5}; List list = Arrays.asList(datas); list.add(6);然后運(yùn)行后卻拋出了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,而是另一個(gè)類:
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable
抽象類AbstractList 定義了一系列比如add()、remove()修改list的方法,然而在這個(gè)ArrayList中并沒有實(shí)現(xiàn)它們,所以返回的ArrayList是不支持修改操作的。
那么如果想要對其進(jìn)行add或者remove應(yīng)該怎么做呢?
Integer[] datas = new Integer[]{1,2,3,4,5}; ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(datas));?
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Java Arrays.asList注意事项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 很慌!一次惊心动魄的服务器误删文件的恢复
- 下一篇: docker 安装zookeeper集群