日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Arrays.asList 使用细节

發布時間:2023/12/9 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的Arrays.asList 使用细节的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。