欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

原来Java中有两个ArrayList

程序员文章站 2024-03-08 20:39:16
首先给出一段代码: public class aslistmethod { public static void main(string[] args) {...

首先给出一段代码:

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程序设计有所帮助。