当前位置: 移动技术网 > IT编程>开发语言>Java > 原来Java中有两个ArrayList

原来Java中有两个ArrayList

2019年07月22日  | 移动技术网IT编程  | 我要评论
首先给出一段代码: 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程序设计有所帮助。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网