Arrays.asList 使用細節

通常初始化后使用如下,但是報錯 UnsupportOperationException....

根據提示信息,就是調用add()方法時拋出了異常。順著堆棧信息往上找,提示的是AbstractList類的108行出了異常,這一行所在方法的具體實現如下:

//108行
public boolean add(E var1) {this.add(this.size(), var1);return true;}
//148行
public void add(int var1, E var2) {throw new UnsupportedOperationException();}//下面看下Arrays.asList的具體實現
@SafeVarargs
public static <T> List<T> asList(T... var0) {return new Arrays.ArrayList(var0);
}//Arrays.ArrayList 實現
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, Serializable {private static final long serialVersionUID = -2764017481108945198L;private final E[] a;//關鍵
    ArrayList(E[] var1) {this.a = (Object[])Objects.requireNonNull(var1);}public int size() {return this.a.length;}public Object[] toArray() {return (Object[])this.a.clone();}public <T> T[] toArray(T[] var1) {int var2 = this.size();if (var1.length < var2) {return Arrays.copyOf(this.a, var2, var1.getClass());} else {System.arraycopy(this.a, 0, var1, 0, var2);if (var1.length > var2) {var1[var2] = null;}return var1;}}public E get(int var1) {return this.a[var1];}public E set(int var1, E var2) {Object var3 = this.a[var1];this.a[var1] = var2;return var3;}public int indexOf(Object var1) {Object[] var2 = this.a;int var3;if (var1 == null) {for(var3 = 0; var3 < var2.length; ++var3) {if (var2[var3] == null) {return var3;}}} else {for(var3 = 0; var3 < var2.length; ++var3) {if (var1.equals(var2[var3])) {return var3;}}}return -1;}public boolean contains(Object var1) {return this.indexOf(var1) != -1;}public Spliterator<E> spliterator() {return Spliterators.spliterator(this.a, 16);}public void forEach(Consumer<? super E> var1) {Objects.requireNonNull(var1);Object[] var2 = this.a;int var3 = var2.length;for(int var4 = 0; var4 < var3; ++var4) {Object var5 = var2[var4];var1.accept(var5);}}public void replaceAll(UnaryOperator<E> var1) {Objects.requireNonNull(var1);Object[] var2 = this.a;for(int var3 = 0; var3 < var2.length; ++var3) {var2[var3] = var1.apply(var2[var3]);}}public void sort(Comparator<? super E> var1) {Arrays.sort(this.a, var1);}
}
//此處可以發現,改內部類繼承了 AbstractList 但是卻沒有實現其的add,remove等方法。(下面給出AbstractList 的定義)
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {protected transient int modCount = 0;protected AbstractList() {}public boolean add(E var1) {this.add(this.size(), var1);return true;}public abstract E get(int var1);public E set(int var1, E var2) {throw new UnsupportedOperationException();}public void add(int var1, E var2) {throw new UnsupportedOperationException();}public E remove(int var1) {throw new UnsupportedOperationException();}.......
}

最后,我們發現,此ArrayList不是彼ArrayList。這個ArrayList是Arrays工具類中實現的內部靜態類,我們可以發現,這個類集成了AbstractList類,但是并沒有重寫add()方法,所以在我們的示例代碼標記(2)處調用add()方法時,實際是調用父類AbstractList的add()方法,這也就回到了開頭分析的那兩個add()方法了,它們都沒有具體實現,只會拋出UnsupportedOperationException。

結論總結:

  我們調用Arrays的asList()方法將數組轉換成List時返回的是Arrays的靜態內部類ArrayList,它自身并未重寫add()方法,而其父類AbstractList實現的add()方法只會拋出UnsupportedOperationException,導致我們調用Arrays的靜態內部類ArrayList的add()方法時,實際調用的是只會拋出UnsupportedOperationException的AbstractList的add()方法,這就是異常出現的原因了。

解決辦法

4、 解決方案?
可以自己寫個工具類轉換方法,可以參考一下代碼:

private static <E> List<E> transferArrayList(E[] array){
List<E> transferedList = new ArrayList<>();
Arrays.stream(array).forEach(arr -> transferedList.add(arr));
return transferedList;
}

?

轉載于:https://www.cnblogs.com/weixiaotao/p/11345125.html

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

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

相關文章

[分享] 精神崩潰的老鼠

李國棟床上堆著書&#xff0c;每天晚上睡在榻榻米上&#xff0c;讀書讀到凌晨一兩點&#xff0c;讀到兩眼充血&#xff0c;像針扎一樣痛苦&#xff0c;才把書放開。蜷縮到榻榻米上&#xff0c;用繩子把左腿跟一只桌腳綁在一起&#xff0c;熄了燈睡覺。 “這樣一來&#xff0…

(七)整合spring cloud云服務架構 - common-service 項目構建過程

我們將對common-service整個項目進行剖析&#xff0c;將整個構建的流程給記錄下來&#xff0c;讓更多的關注者來參考學習。首先在構建spring cloud的common-service之前&#xff0c;我們需要準備的技術&#xff1a;Maven&#xff08;項目構建&#xff09;、Spring Boot、Spring…

python list元素合并_python list 合并連接字符串的方法

python list 合并連接字符串的方法 更新時間&#xff1a;2013年03月09日 22:02:18 作者&#xff1a; python 列表合并字符串&#xff0c;我們一般會用到字符串的join方法來操作。下面通過代碼的形式&#xff0c;詳細的說下list怎么拼成字符串&#xff1f; 相關文章這篇文章主要…

修改citrix 默認偵聽端口的命令和XML Service端口

修改citrix 默認偵聽端口的命令&#xff1a; 在命令行下輸入icaport /port&#xff1a;2494&#xff0c;或你所想改成的端口 如果輸入 icaport /reset 恢復默認偵聽端口 ctxxmlss /r8080 在citrix的外部客戶端通過web方式登陸時&#xff0c;提示“the alternate address cannot…

spfa算法

1 轉載于:https://www.cnblogs.com/Emcikem/p/11346073.html

集成方法-概念理解

集成方法&#xff08;ensemble method&#xff09;又叫元算法&#xff08;meta-algorithm&#xff09;&#xff1a;將不同的分類器組合起來。 通俗的說&#xff1a;就是三個臭皮匠賽過諸葛亮。做決定時&#xff0c;考慮多個人的意見&#xff0c;不是一個人的意見 集成方法&…

單片機按鍵防抖程序_這些單片機按鍵設計方案,請拿好,不謝!

在單片機系統里&#xff0c;按鍵是常見的輸入設備&#xff0c;在本文中介紹幾種按鍵硬件、軟件設計方面的技巧。一般的在按鍵的設計上&#xff0c;一般有四種方案&#xff0c;創客學院帶你零基礎學習電子產品設計。一是GPIO口直接檢測單個按鍵&#xff0c;如圖1.1所示;二是按鍵…

Oracle 11G 安裝詳解

oracle官網下載地址&#xff1a;http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 官網下載需要注冊orcale賬號&#xff0c;比較繁瑣&#xff0c;這里直接放已經下載好的安裝包鏈接 Oracle11G下載鏈接: https://pan.baidu.com/s/1v6oD4jAt…

程序員何苦為難程序員?

有時候想想程序員為何為難程序員呢&#xff1f; 扳扳手指走上碼農這個行業也有幾年了&#xff0c;但是越來越覺得這個行業很累&#xff0c;有人說程序員就是二代農民工&#xff0c;我個人還是比較贊同的&#xff0c;對于剛入道的同仁們來說確實就是個體力(腦力&#xff0c;眼力…

kubeadm部署k8s_用 kubeadm 部署生產級 k8s 集群

概述kubeadm 已?持集群部署&#xff0c;且在1.13 版本中 GA&#xff0c;?持多 master&#xff0c;多 etcd 集群化部署&#xff0c;它也是官?最為推薦的部署?式&#xff0c;?來是由它的 sig 組來推進的&#xff0c;?來 kubeadm 在很多??確實很好的利?了 kubernetes 的許…

poj 題目分類

1000 AB Problem 送分題 1001 Exponentiation 高精度 1003 Hangover 送分題 1004 Financial Management 送分題 1005 I Think I Need a Houseboat 幾何 1006 Biorhythms 送分題 1007 …

模板的語法

我已經碰到過好幾次這種錯誤了. template<typename R>static_inline vec4<typename R::scalar>point(constrhs2<R>&v) { returnvec4<P>(v.x, v.y, 0, 1); } template<typename R>static_inline vec4<typename R::sca…

統計學習方法概論---分類問題

為什么80%的碼農都做不了架構師&#xff1f;>>> 分類問題 轉載于:https://my.oschina.net/liyangke/blog/2945185

IEPLUS(IE增強性插件)

用Vista好長好長時間了&#xff0c;除了比較吃硬件、老的游戲不兼容、我350W像素的老羅技不能用等等&#xff0c;感覺不是非常不錯的。IE 7也還可以&#xff0c;后來我試用了傲游、火狐&#xff0c;在多標簽后傲游的一些操作更人性化&#xff0c;我最喜歡它的托拉即可自動出新標…

CENTOS7 Python3.7 PyAudio 安裝

2019獨角獸企業重金招聘Python工程師標準>>> 出現錯誤: gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -fPIC -I/usr/local/python371/include/python3.7m -c src/_portaudiomodule.c -o build/temp.linux-aarch64-3.7/src/…

bash for循環_Bash 中的 For 循環

循環是編程語言的基本概念之一。當你想要一遍又一遍地運行一系列命令直到達到某個條件后終止退出時&#xff0c;循環很方便。在諸如 Bash 之類的腳本語言中&#xff0c;循環對于自動執行重復性任務非常有用。在 Bash 腳本中有3個基本的循環結構&#xff0c;for 循環&#xff0c…

Atlas Unknown Error

if("using Atlas" and "there are some js codes in HEAD tag") then "Unknown Error" solution: copy the js codes to other position 轉載于:https://www.cnblogs.com/JoeHou/archive/2009/02/03/1383231.html

軟件工程師的6年總結

“又是一年畢業時”&#xff0c;看到一批批學子離開人生的象牙塔&#xff0c;走上各自的工作崗位&#xff1b;想想自己也曾經意氣風發、躊躇滿志&#xff0c;不覺感嘆萬千……本文是自己工作6年的經歷沉淀或者經驗提煉&#xff0c;希望對所有的軟件工程師們有所幫助&#xff0c…

linux 信號_Linux的信號和線程

Linux的信號和線程-Tech Talk 讓技術發出聲音?www.ttalk.im什么是線程線程&#xff0c;有時被稱為輕量級進程(Lightweight Process&#xff0c;LWP&#xff09;&#xff0c;是程序執行流的最小單元。一個標準的線程由線程ID&#xff0c;當前指令指針(PC&#xff09;&#xff0…