List的特点:
(1)有序:输出元素的顺序与添加元素的顺序相同。
(2)可重复(不唯一):可以添加重复元素(2)可重复(不唯一)
(3)当删除一个集合元素时,之后的所有元素的下标会向前补齐。
List删除元素的三种方式:
(1)正向删除:
一般会用这种方式:
//创建集合
List list=new ArrayList();
//添加元素
list.add("zyf");
list.add("qhp");
list.add("wch");
list.add("lky");
//开始遍历输出元素
System.out.println("集合长度:"+list.size());
for (int i=0;i<list.size();i++){
list.remove(i);
}
System.out.println("集合长度:"+list.size());
但是由于List集合删除一个元素,它之后所有的元素下标都会向前补齐的特点,并且,for循环中的list.size()这时需要重新获取值与i的值也加了1,导致无法全部删除。
最后出现这种情况:
这时要将list.size()写在for循环之外并接受值,再写入for循环中:
System.out.println("集合长度:"+list.size());
int size = list.size();
for (int i=0;i<size;i++){
list.remove(0);
}
System.out.println("集合长度:"+list.size());
(2)逆向删除
结合上述弊端,我们可以运用另一种删除方式
逆向删除:
从集合的最后一个元素开始删除,避免了下标向前补齐的情况。
代码如下:
System.out.println("集合长度:"+list.size());
for (int i=size-1;i>=0;i--){
list.remove(i);
}
System.out.println("集合长度:"+list.size());
(3)迭代器删除
可能会有人会写成这样:
System.out.println("集合长度:"+list.size());
Iterator it = list.iterator();
while (it.hasNext()){
it.remove();
it.next();
}
System.out.println("集合长度:"+list.size());
但是由于it.hasNext(),这个方法的特点是,不移动下标,只侦测下一元素是否存在,并且返回boolean值;而种写法错误就在它没有先移动下标,导致指针指向的还是空的区域,最后导致报错。
正确方式如下:
System.out.println("集合长度:"+list.size());
Iterator it = list.iterator();
while (it.hasNext()){
it.next();
it.remove();
}
System.out.println("集合长度:"+list.size());
先用next()方法使下标移动到0,之后再删除。