程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 本來Java中有兩個ArrayList

本來Java中有兩個ArrayList

編輯:關於JAVA

本來Java中有兩個ArrayList。本站提示廣大學習愛好者:(本來Java中有兩個ArrayList)文章只能為提供參考,不一定能成為您想要的結果。以下是本來Java中有兩個ArrayList正文


起首給出一段代碼:

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法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved