对于ArrayList元素的删除,之前有些没有注意的点,这里记录一下。
1. 普通for循环删除
答案一点都不意外,可是看下图(将ArrayList中重复的元素放置相邻):
原因:因为在ArrayList底层用的是数组实现,所以存储的时候是一块连续的地址。当检测相同元素并删除的同时,之后的整个数组就和集体往前移动,此次循环结束后的累加器又 ++1,所有相邻的一个就会被忽略掉。
解决:(删除后,指针往前移动一位)
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
for (int i = 0; i < list.size(); i++) {
if("b".equals(list.get(i))){
list.remove(i --);
}
}
System.out.println(list);
2.迭代器删除
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
//迭代器删除
Iterator<String> it = list.iterator();
while (it.hasNext()) {
if("b".equals(it.next())){
list.remove("b");
}
}
System.out.println(list);
结果:(并发修改异常,迭代器获得元素信息,在迭代中删除了集合中的数据)
不能用集合的删除,用迭代器的删除。
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
//迭代器删除
Iterator<String> it = list.iterator();
while (it.hasNext()) {
if("b".equals(it.next())){
//list.remove("b");
it.remove();
}
}
System.out.println(list);
迭代器的另一种写法
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
for(Iterator<String> it2 = list.iterator();it2.hasNext();){
it2.remove();
}
System.out.println(list);