為什麼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 <
為什麼Java裡的Arrays.asList不能用add和remove方法?
在平時的開發過程中,我們知道可以將一個Array的物件轉化為List。這樣的操作,我們只要採用Arrays.asList這個方法就行了。筆者前段時間一直用這個方法,有一天,我發現通過Arrays.asList得到的List無法進行add和remove等操作。 下面是一段很簡
java中重寫TreeMap的add和remove方…
sample.org.jasen.learn06public class Test {(String[] args) { TreeNode treeNode = TreeNod
陣列轉換為List(Arrays.asList)後add或remove出現UnsupportedOperationException
從別的部落格上看到了出現這種情況的分析,我也不再自己從頭分析了,附上大神分析好的。 Java中,可以使用Arrays.asList(T... a)方法來把一個數組轉換為List,返回一個受指定陣列支援的固定大小的列表。此方法同 Collection.toArray()一起
Java裡Date類的parse和format方法
Date date = new Date(); //獲取當前系統時間,格式為: Thu Nov 01 18:27:06 CST 2018 format: 按指定的目標格式把Date物件轉換為String parse: 按指定的源格式把String轉換為Date物件 pu
ArrayList和LinkedList add和remove方法的比較
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,不可進行add和remove操作的原因
直接上程式碼: import java.util.Arrays; import java.util.List; public class Test { public static void main(String[] args) { Integ
【JAVA】Arrays.asList和List的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迴圈時,不能使用add和remove不然會報錯
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集合中的add和remove的問題
這是一個重新整理三觀的問題: 是的,你沒有看錯,list竟然不支援remove方法,那麼這是為什麼呢??? 原因在於: 1、上述程式碼中Arrays.asList(strings)返回的list並不是我們所認知的ArrayList,我們可以點選asLi
set add 調用hashcode和eques方法
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()方法,那麽我們可