Arrays.asList() 返回的list不能add,remove

一.Arrays.asList() 返回的list不能add,remove

Arrays.asList()返回的是List,而且是一個定長的List,所以不能轉換為ArrayList,只能轉換為AbstractList

原因在于asList()方法返回的是某個數組的列表形式,返回的列表只是數組的另一個視圖,而數組本身并沒有消失,對列表的任何操作最終都反映在數組上. 所以不支持remove,add方法的

下面是一段很簡單的測試代碼: ?

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()陷阱

代碼如下:?

Java代碼??

public?static?void?main(String[]?args)?{??int[]?data?=?{1,2,3,4,5};??List?list?=?Arrays.asList(data);??System.out.println("列表中的元素數量是:"?+?list.size());??}??


? 注意這里輸出的數量是1,原因是,在Arrays.asList中,其接收的參數原型其實是泛型變長參數來的,而基本類型是不能作為范型的參數,按道理應該使用包裝類型,但這里缺沒有報錯,?
因為數組是可以泛型化的,所以轉換后在list中就有一個類型為int的數組?

Java代碼??

        int[]?data?=?{1,2,3,4,5};??List?list?=?Arrays.asList(data);??System.out.println("元素類型:"?+?list.get(0).getClass());??System.out.println("前后是否相等:"+data.equals(list.get(0)));??


? 可以看到,輸出的為元素類型:class [I??
因為jvm不可能輸出array類型,array類型屬于java.lang.reflect包,通過反射訪問?
數組的這個類,編譯時候生成的。所以要改為:?

Java代碼??

Integer[]?data?=?{1,2,3,4,5};??
List?list?=?Arrays.asList(data);??
System.out.println("列表中的元素數量是:"?+?list.size());??


?此外,假如如下代碼:?

Java代碼??

//枚舉,聲明一個星期??
enum?Week{Sun,Mon,?Tue,?Wed,Thu,Fri,Sat}??????
public?static?void?main(String[]?args)?{??//工作日??Week[]?workDays?=?{Week.Mon,?Week.Tue,?Week.Wed,Week.Thu,Week.Fri};??//轉換為列表??List<Week>?list?=?Arrays.asList(workDays);??//增加周六也為工作日??list.add(Week.Sat);??


?注意這里用add會出錯,因為是arrays.aslist中,看代碼可以看到這里返回的?
ArrayList不是原來的傳統意義上的java.util.arraylist了,而是自己工具類的一個?
靜態私有內部類,并沒有提供add方法,要自己實現,所以這里是出錯了,因此,?
除非確信array.aslist后長度不會增加,否則謹慎使用:?
???List<String> abc=Arrays.asList("a","b","c"),因為這樣的長度是無法再add的了?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42092.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42092.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42092.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Wireshark 抓包過濾命令匯總

Wireshark 抓包過濾命令匯總 Wireshark 是一個強大的網絡分析工具&#xff0c;它可以幫助網絡管理員和安全專家監控和分析網絡流量。通過捕獲網絡數據包&#xff0c;Wireshark 能夠幫助我們識別網絡中的問題、瓶頸以及潛在的安全威脅。在使用 Wireshark 進行網絡數據包分析時&…

SQL Server基礎之游標

一&#xff1a;認識游標 游標是SQL Server的一種數據訪問機制&#xff0c;它允許用戶訪問單獨的數據行。用戶可以對每一行進行單獨的處理&#xff0c;從而降低系統開銷和潛在的阻隔情況&#xff0c;用戶也可以使用這些數據生成的SQL代碼并立即執行或輸出。 1.游標的概念 游標是…

DELL PowerEdge R720XD 磁盤RAID及Hot Spare熱備盤配置

一臺DELL PowerEdge R720XD服務器&#xff0c;需進行磁盤RAID及Hot Spare熱備盤配置&#xff0c;本文記錄配置過程示例。 一、設備環境 服務器型號&#xff1a;DELL PowerEdge R720XD 硬盤配置&#xff1a;800G硬盤共24塊 二、配置計劃 1、當前狀態&#xff1a;2塊盤配置RAID…

AIGC+游戲:一個被忽視的長賽道

&#xff08;圖片來源&#xff1a;Pixels&#xff09; AIGC徹底變革了游戲&#xff0c;但還不夠。 數科星球原創 作者丨苑晶 編輯丨大兔 消費還沒徹底復蘇&#xff0c;游戲卻已經出現拐點。 在游戲熱度猛增的背后&#xff0c;除了版號的利好因素外&#xff0c;AIGC技術的廣泛…

js下載后端返回的文件

文件流下載 后端返回文件流形式&#xff0c;前端下載 // res 為請求返回的數據對象const file_data res.data // 后端返回的文件流const blob new Blob([file_data]) const href window.URL.createObjectURL(blob) // 創建下載的鏈接 const file_name decodeURI(res.header…

4. 軟件開發的環境搭建

目錄 1. 搭建環境 1.1 檢查 JDK 1.2 檢查 MySQL 數據庫 1.3 檢查 Maven 1.4 檢查 GITEEGIT 1.5 安裝插件 1.5.1 安裝 Spring Boot Helper 1.5.2 安裝 lombok 1.6 創建倉庫 1.6.1 登錄 GITEE 創建倉庫并復制倉庫地址 1.6.2 克隆到本地 1.7 創建工程 1.7.1 設置編碼…

【Spring】Bean的實例化

1、簡介 在容器中的Bean要實例化為對象有三種方式 1、構造方法 2、靜態工廠 3、實例工廠 4、實現工廠接口 2、構造方法 構造方法實例化Bean即是直接通過構造方法創建對象 <bean id"bookDao" class"com.wn.spring.dao.impl.BookDaoImpl"/> 當不存在…

怎么把pdf壓縮到5m以內?壓縮辦法非常多

怎么把pdf壓縮到5m以內&#xff1f;PDF文件是我們辦公過程中較為常用的文件格式&#xff0c;PDF文件所包含的內容通常較多&#xff0c;比如文本、圖像以及音視頻等等。這樣的話&#xff0c;PDF文件占用內存也較大。如果需要對PDF文件進行使用、傳輸、分享等的話&#xff0c;可能…

單片機之從C語言基礎到專家編程 - 4 C語言基礎 - 4.8 運算符

1.算術運算符 運算符名稱備注加法運算符雙目運算&#xff0c;a b-減法運算符雙目運算&#xff0c;a - b*乘法運算符雙目運算&#xff0c;a * b/除法運算符雙目運算&#xff0c;a / b%求余運算符雙目運算, a % b自增運算符單目運算, a–自減運算符單目運算, a– 2.關系運算符…

Vue2集成Echarts實現可視化圖表

一、依賴配置 1、引入echarts相關依賴 也可以卸載原有的&#xff0c;重新安裝 卸載&#xff1a;npm uninstall echarts --save 安裝&#xff1a;npm install echarts4.8.0 --save 引入水球圖形依賴 npm install echarts-liquidfill2.0.2 --save 水球圖可參考文檔&#xff1…

MySQL索引(Index)

Index 數據庫中的索引&#xff08;Index&#xff09;是一種數據結構&#xff0c;用于提高數據庫查詢性能和加速數據檢索過程。索引可以看作是數據庫表中某個或多個列的數據結構&#xff0c;類似于書中的目錄&#xff0c;可以幫助數據庫管理系統更快地定位和訪問數據。它們是數…

Linux——KVM虛擬化

目錄標題 虛擬化技術虛擬化技術發展案例KVM簡介KVM架構及原理KVM原理KVM虛擬化架構/三種模式虛擬化前、虛擬化后對比KVM蓋中蓋套娃實驗 虛擬化技術 通過虛擬化技術將一臺計算機虛擬為多臺邏輯計算機&#xff0c;在一臺計算機上同時運行多個邏輯計算機&#xff0c;同時每個邏輯…

智安網絡|零信任安全框架:保障數字化時代網絡安全的最佳實踐

隨著數字化時代的快速發展&#xff0c;網絡安全問題變得越來越突出。傳統的安全防御模式已經不再適用于現代復雜的網絡環境中。為了應對日益增長的網絡威脅&#xff0c;零信任安全模式應運而生。 一、什么是零信任&#xff1f; 零信任是一種安全框架和哲學&#xff0c;它基于…

pytest的fixture梳理

fixture特性 夾具是在測試中用于提供共享資源、設置測試環境或模擬行為的工具。 1. 可以重復使用&#xff0c;多個用例可以使用同一個fixture 2. 一個測試用例可以使用多個裝置 import pytest # Arrange pytest.fixture def first_entry():return "a"# Arrange pyt…

全新 – Amazon EC2 M1 Mac 實例

去年&#xff0c;在 re: Invent 2021 大會期間&#xff0c;我寫了一篇博客文章&#xff0c;宣布推出 EC2 M1 Mac 實例的預覽版。我知道你們當中許多人請求訪問預覽版&#xff0c;我們盡了最大努力&#xff0c;卻無法讓所有人滿意。不過&#xff0c;大家現在已經無需等待了。我很…

postmarketOS

主步驟 #以下全程插入usb線 fastboot devices fastboot getvar all fastboot erase userdata fastboot erase system fastboot erase cachepmbootstrap init pmbootstrap installpmbootstrap flasher flash_rootfs --partition userdata pmbootstrap flasher flash_kernel…

java生成Excel表格

public HSSFWorkbook CreateJZZJSList() {// 繪制ExcelString fileName "自動分析詳情";HSSFWorkbook wb new HSSFWorkbook();//創建工作相簿對象HSSFSheet sheet wb.createSheet(fileName); // --->創建了一個工作簿sheet.setDefaultRowHeight((short) 600);…

前端開發工具及環境配置

1.前端開發環境node npm環境配置 第一步&#xff1a;打開Download | Node.js (nodejs.org)下載&#xff0c;解壓。 找到下載壓縮包進行解壓 解壓到D盤目錄下&#xff1a; 第二步&#xff1a;配置環境變量&#xff1a;右擊此電腦點擊屬性進入高級系統設置 點擊高級系統設置進入…

項目管理系統是什么?能干什么?有什么功能?一文看懂

閱讀本文您可以了解&#xff1a;1、項目任務管理系統是什么&#xff1b;2、項目任務管理系統的作用&#xff1b;3、項目任務管理系統的功能 一、什么是項目任務管理 項目任務管理是指運用系統的理論方法&#xff0c;在有限的條件和資源下&#xff0c;對項目從開始到結束的全流…

Github下載任意版本的VsCode

下載歷史版本VsCode(zip) 下載鏈接由三部分組成&#xff1a; 固定部分commit idVSCode-win32-x64-版本號.zip 固定部分&#xff1a; https://vscode.cdn.azure.cn/stable/ Commit id&#xff1a; 打開 vscode的GitHub&#xff1a;[https://github.com/microsoft/vscode/r…