从ArrayList中删除项目时出错

时间:2013-04-07 06:42:48

标签: java multithreading

我正在尝试使用线程从列表中删除一个值。但代码失败并给出了异常。 Plz帮助我成为线程编程的初学者......

这是Test.java

的内容
import java.util.*;

public class Test {
    private static final List<Integer> Values = new ArrayList<Integer> ();
    public static void main(String args[]) {
        TestThread t1 = new TestThread(Values);
        t1.start();

        System.out.println(Values.size());
    }
}

这是TestThread.java

的内容
import java.util.*;

public class TestThread extends Thread {
    private final List<Integer> Values;

    public TestThread(List<Integer> v) {
        this.Values = v;
        Values.add(5);
    }

    public void run() {
        Values.remove(5);
        System.out.println("5 removed");
    }
}

4 个答案:

答案 0 :(得分:3)

此行表示:删除索引5处的值。但索引5中没有任何内容。

    Values.remove(5);

目前数组中只有1个值,因为此行表示将值5添加到我的列表中,而不是将5个值添加到我的列表中。

    Values.add(5);

您的错误很可能是IndexOutOfBoundsException。如果您显示列表的大小,您会更清楚地看到它。

public void run() {
    System.out.println(Values.size()); // should give you 1
    Values.remove(5);
    System.out.println("5 removed");
}

它的外观如下:

enter image description here

插入时,5自动装入Integer对象。因此,要成功删除它,您应该将其包装成一个:new Integer(5)。然后发出删除电话。然后它将调用接受Object的重载版本的remove,而不是int。

Values.remove(new Integer(5));

表示从列表中删除名为“5”的整数对象

答案 1 :(得分:2)

List#remove(int)方法从列表中删除指定位置的元素,因此Values.remove(5)将尝试在索引5元素处删除哪个元素存在于那里。此处int值5将不会自动生成,因为List#remove(int)已存在。

您应该使用实际为List#remove(Object o)的{​​{1}}。

Values.remove(new Integer(5))

答案 2 :(得分:1)

您对Values.remove(5);的致电未达到您的预期。您在参数中传递的int是索引值,因此它尝试删除arraylist中索引5处的项目,但其中只有1个值。

一种解决方法,可让您删除给定值的整数

int given = 5;
for (int curr = 0; curr < Values.size(); curr++){
    if (Values.get(curr) == given) {
         Values.remove(given);
    }
}

答案 3 :(得分:1)

List (ArrayList)中有2个remove方法(重载)

  1. remove(int) - &gt;这意味着删除索引
  2. remove(Object) - &gt;这意味着从列表中删除特定对象
  3. 当你说Values.remove(5)时,编译器将5作为int并调用remove(int)方法,该方法试图删除索引5处的值存储。由于索引5,dint已经任何值,IndexOutOfBoundException都被抛出。

    要解决它,比如remove(new Integer(5)),要编译,调用remove(Object)方法。 有关更清晰的信息,请参阅此SO thread