原來Java中有兩個ArrayList_java

來源:互聯網
上載者:User

首先給出一段代碼:

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程式設計有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.