1. 程式人生 > >為什麼Java裡的Arrays.asList不能用add和remove方法?

為什麼Java裡的Arrays.asList不能用add和remove方法?

在平時的開發過程中,我們知道可以將一個Array的物件轉化為List。這樣的操作,我們只要採用Arrays.asList這個方法就行了。筆者前段時間一直用這個方法,有一天,我發現通過Arrays.asList得到的List無法進行add和remove等操作。

下面是一段很簡單的測試程式碼:  

    public class MainFacade {
        public static void main(String[] args) {
            List<Integer> list = Arrays.asList(1,2,3);
            list.add(5);
            System.out.print(list.toString());
        }
    }

不過上面的程式碼會throw出一個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 org.popkit.MainFacade.main(MainFacade.java:14) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

終其原因是Arrays.asList方法返回的ArrayList是繼承自AbstractList同時實現
了RandomAccess和Serializable介面,定義如下:  
    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable

我們再來看看AbstractList這個類的定義:  
    public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> 

這時我們發現AbstractList這個類的set add remove方法定義如下:

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

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

    public E remove(int index) {
        throw new UnsupportedOperationException();
    }
現在知道了它throw UnsupportedOperationException異常的原因了。  

通過上面的分析,我們知道,其實通過asList方法得到的List是隻讀的,那麼平時我們怎樣避免這樣的錯誤發生?我們可以採用如下方法:  

    List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3));





相關推薦

Arrays.asList 使用add remove方法 出現java.lang.UnsupportedOperationException

陣列轉化集合 陣列轉化為集合時 Java有提供相應的工具類方法 Arrays.asList()方法 但是當使用Arrays.asList()方法,會可能出現一些操作問題。 先分析一下該方法原始碼: @SafeVarargs public static <

為什麼JavaArrays.asList不能addremove方法

在平時的開發過程中,我們知道可以將一個Array的物件轉化為List。這樣的操作,我們只要採用Arrays.asList這個方法就行了。筆者前段時間一直用這個方法,有一天,我發現通過Arrays.asList得到的List無法進行add和remove等操作。 下面是一段很簡

java中重寫TreeMap的addremove方…

sample.org.jasen.learn06public class Test {(String[] args) { TreeNode treeNode = TreeNod

陣列轉換為List(Arrays.asList)後addremove出現UnsupportedOperationException

從別的部落格上看到了出現這種情況的分析,我也不再自己從頭分析了,附上大神分析好的。 Java中,可以使用Arrays.asList(T... a)方法來把一個數組轉換為List,返回一個受指定陣列支援的固定大小的列表。此方法同 Collection.toArray()一起

JavaDate類的parseformat方法

Date date = new Date(); //獲取當前系統時間,格式為: Thu Nov 01 18:27:06 CST 2018 format: 按指定的目標格式把Date物件轉換為String parse: 按指定的源格式把String轉換為Date物件 pu

ArrayListLinkedList addremove方法的比較

ArrayList 是一種可增長的陣列的實現。 使用ArrayList的優點在於 對 get和set的呼叫是花費常數時間。缺點就是有新的項插入,和現有的項刪除代價昂貴,除非變動是 在ArrayList的末端進行。 使用LinkedList的優點在於新的項的插入和現有的項的

Arrays.asList()返回ArrayList呼叫remove()或add()出現 java.lang.UnsupportedOperationException異常

Iterator和ListIterator可以對集合遍歷同時可以做remove操作, 但在呼叫Arrays.asList()轉化為ArrayList的過程中並不能呼叫remove() public class Test { public static void

將陣列轉換成集合Arrays.asList,不可進行addremove操作的原因

直接上程式碼: import java.util.Arrays; import java.util.List; public class Test { public static void main(String[] args) { Integ

JAVAArrays.asListList的add方法一起使用報錯

使用例子:import java.util.Arrays; import java.util.List;public class test { public static void main(

java的日期格式 UTC本地時間互轉

Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) -1);//當前時間的前一小時舉例 SimpleDateFormat d

forearch迴圈時,不能使用addremove不然會報錯

forearch迴圈注意事項 不要在 foreach 迴圈裡進行元素的 remove/add 操作。remove 元素請使用 Iterator 方式,如果併發操作,需要對 Iterator 物件加鎖。 正例: Iterator<String> iterator = l

java.util.Arrays.asList使用體會

下面的程式碼執行後 privatevoid onButtonAsListClick() {      String[] strArray = new String[] { "aa", "bb" };      List<String> list = Arra

shell的萬字元管道

複習; 硬連線必須是同一個磁碟分割槽內,不能跨裝置,而軟連線是可以的。 ====================================================================================================

List集合中的addremove的問題

這是一個重新整理三觀的問題: 是的,你沒有看錯,list竟然不支援remove方法,那麼這是為什麼呢??? 原因在於: 1、上述程式碼中Arrays.asList(strings)返回的list並不是我們所認知的ArrayList,我們可以點選asLi

set add 調hashcodeeques方法

ret 不同 shc 接口 details 二叉 .net tps rabl https://blog.csdn.net/yuanboqi/article/details/79756266 https://blog.csdn.net/smiling_Z/article/d

Java編譯器如何生成重載覆蓋方法代碼

hang java sim 如何 oct imu pla 編譯 poc %E5%AE%9E%E9%AA%8C10%EF%BC%9AProblem%20C%3A%20STL%E2%80%94%E2%80%94%E5%91%B5%E5%91%B5%E5%9E%8B%E8%87%

jquery的empty()remove()方法

html ive 效果 span -c cnblogs empty con ace jquery之empty()與remove()區別 要用到移除指定元素的時候,發現empty()與remove([expr])都可以用來實現。可仔細觀察效果的話就可以發現。empty(

整理類的調方式構造方法

-c .com per reading 實現 super 變量 image next 前言:簡單版:類加括號執行__init__()對象加括號執行__call__(),     全版:類是type創建的,創建類的時候type的__init__()方法自動執行,類加括號的時候

Eclipse中修改SVN戶名密碼方法

int 代碼 cati face 常用 java style ica 選項 在用eclipse的時候會經常用到SVN來進行代碼的版本控制,為了方便起見,我們會保存密碼,從此之後就不會再出現輸入或者修改用戶名和密碼的地方了,這時候想切換用戶怎麽辦,在本地操作的一種方法

Java多線程系列-start()run方法的區別

java多線 情況下 pub -s name println get system runt start()和run是Thread類裏面的兩個方法。 學過的都知道,我們創建了一個線程類,通過調用start()方法來啟動線程,並且該線程會執行內部的run()方法,那麽我們可