Java List(ArrayList初始化)删除元素
概述
对于使用ArrayList初始化的List对象,在进行删除元素时,可能会出现一些无法预料到的问题,就像这样一段代码:
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Integer> lst = new ArrayList<Integer>();
lst.add(1);
lst.add(2);
lst.add(2);
lst.add(3);
lst.add(4);
lst.add(5);
for (int i = 0; i < lst.size(); ++i) {
if (lst.get(i) == 2) {
lst.remove(i);
}
}
for (int i = 0; i < lst.size(); ++i) {
System.out.println("lst has: " + lst.get(i));
}
}
如果不了解remove的行为,可能会认为lst中将没有2这个元素了,其实不然,结果与预料的不太一样:
lst has: 1
lst has: 2
lst has: 3
lst has: 4
lst has: 5
出现这个问题的原因是由于remove之后,后面的元素会往前移动,所以之后索引对应的元素就改变了,那么之后的操作也是不是在我们原先预想的对象上进行了。简单的解决办法:也可以从后往前遍历,如此,即使元素向前移动,也不会影响到原先索引对应的元素了,不过这种方法也不是很好,这里则可以使用一个更为推荐的做法。
使用List Iterator进行删除
使用Iterator的好处是,remove行为操作在哪个对象上更加清晰。这里要注意,一定是要调用Iterator的remove方法,而不是List的remove方法。具体代码如下:
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Integer> lst = new ArrayList<Integer>();
lst.add(1);
lst.add(2);
lst.add(2);
lst.add(3);
lst.add(4);
lst.add(5);
Iterator<Integer> it = lst.iterator();
while (it.hasNext()) {
Integer val = it.next();
if (val == 2) {
it.remove();
}
}
for (int i = 0; i < lst.size(); ++i) {
System.out.println("lst has: " + lst.get(i));
}
}
相应的结果如下:
lst has: 1
lst has: 3
lst has: 4
lst has: 5