国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

原來Java中有兩個ArrayList

2019-11-26 14:41:53
字體:
來源:轉載
供稿:網友

首先給出一段代碼:

public class AslistMethod { public static void main(String[] args) {  String sentence = "i love you";  List<String> words = Arrays.asList(sentence.split(" "));  for (int i = 0; i < words.size(); ) {   if (words.get(i).equals("love")) {    words.remove(i);    continue;   }   i++;  }  System.out.println(words); }

然后,運行這段代碼,最后,報錯了:

Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.remove(AbstractList.java:161) at list.AslistMethod.main(AslistMethod.java:12)

錯誤鏈的棧底list.AslistMethod.main(AslistMethod.java:12)說的是這一行代碼:

words.remove(i);

這個錯誤讓我很迷茫,因為我寫這段代碼前大概看了一下,Arrays.asList方法返回的是一個ArrayList,咋就不能remove了呢?接下來,由于一個小小的失誤,把Arrays.asList的結果賦給了java.util.ArrayList,居然賦值不成功,我立馬有種瞎貓碰上死耗子的感覺。然后,就順著Arrays.asList方法一直點下去,發現此ArrayList非彼ArrayList。Arrays.asList返回的是java.util.Arrays.ArrayList,它只是Arrays的一個內部類。它的代碼不長,這里直接貼出來:

 private static class ArrayList<E> extends AbstractList<E>  implements RandomAccess, java.io.Serializable {  private static final long serialVersionUID = -2764017481108945198L;  private final E[] a;  ArrayList(E[] array) {   a = Objects.requireNonNull(array);  }  @Override  public int size() {   return a.length;  }  @Override  public Object[] toArray() {   return a.clone();  }  @Override  @SuppressWarnings("unchecked")  public <T> T[] toArray(T[] a) {   int size = size();   if (a.length < size)    return Arrays.copyOf(this.a, size,          (Class<? extends T[]>) a.getClass());   System.arraycopy(this.a, 0, a, 0, size);   if (a.length > size)    a[size] = null;   return a;  }  @Override  public E get(int index) {   return a[index];  }  @Override  public E set(int index, E element) {   E oldValue = a[index];   a[index] = element;   return oldValue;  }  @Override  public int indexOf(Object o) {   if (o==null) {    for (int i=0; i<a.length; i++)     if (a[i]==null)      return i;   } else {    for (int i=0; i<a.length; i++)     if (o.equals(a[i]))      return i;   }   return -1;  }  @Override  public boolean contains(Object o) {   return indexOf(o) != -1;  }  @Override  public Spliterator<E> spliterator() {   return Spliterators.spliterator(a, Spliterator.ORDERED);  } }

從源碼看到,它繼承自AbstractList,并且沒有remove方法,我找到AbstractList的remove方法:

 public E remove(int index) {  throw new UnsupportedOperationException(); }

這就是錯誤信息的來源。最終知道,Arrays.asList返回的ArrayList并不支持remove,實際上,java.util.Arrays.ArrayList不支持任何形式的元素刪除。
總結一下,這次問題的解決確實有點兒瞎貓碰到死耗子的味道,但是,只要我認真看一下報的錯誤:

at java.util.AbstractList.remove(AbstractList.java:161)

調用java.util.AbstractList的remove方法和我預期的不一樣,它就能清晰地告訴我方向。

希望本文所述對大家學習java程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 辽中县| 娄烦县| 晋州市| 合水县| 天门市| 广丰县| 霍山县| 平南县| 陵水| 永顺县| 边坝县| 海淀区| 乐陵市| 彝良县| 铜梁县| 南丹县| 苍南县| 景谷| 阆中市| 广饶县| 福建省| 万安县| 和田县| 开平市| 临澧县| 吉木萨尔县| 土默特右旗| 兰西县| 左贡县| 凤庆县| 嵊泗县| 栖霞市| 广西| 镇沅| 衡南县| 石景山区| 临夏县| 新晃| 东乡| 开化县| 敦化市|