一、List 包含两个 remove 方法
1️⃣按照下标索引删除
2️⃣按照值删除,删除第一个符合的值对象。
二、for 循环 remove
常见写法:(由于下标问题达不到想要效果)
for(int i=0;i<list.size();i++){
if(list.get(i).equals("del"))
list.remove(i);
}
但是直接使用list.remove(i)这个方法的时候,删除第一个继续根据索引访问第2个元素时,因为删除的关系后面的元素都往前移动了一位,所以实际访问的是第3个元素。因此,这种方式可以用在删除特定的一个元素时使用,但不适合循环删除多个元素时使用。倒序操作可以避免下标问题,修改如下:
int size = list.size();
for(int i=size-1;i>=0;i--){
if(list.get(i).equals("del"))
list.remove(i);
}
三、foreach remove
常见错误:(会抛出ConcurrentModificationException)
for(String x:list){
if(x.equals("del"))
list.remove(x);
}
应改为:
//cowlist为原list
CopyOnWriteArrayList<Record> list = new CopyOnWriteArrayList<Record>(cowList);
for(String x:list){
if(x.equals("del"))
list.remove(x);
}
四、iterator 遍历 remove
注意:用的是迭代器的 remove 方法,而不是 list 的 remove 方法。
//iterator遍历,查出对应值,做对应操作
Iterator<String> it = list.iterator();
while(it.hasNext()){
String x = it.next();
if(x.equals("del")){
it.remove();
}
}
最好使用 Iterator 遍历,找到对应的值,全部给 remove 掉,这样就不会受索引的影响。
五、List 集合移除 null 元素
1️⃣集合空元素的处理,api 有直接处理的方法,使用的是迭代器,本质上还是 for 循环的思想。list.removeAll(Collections.singleton(null));
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("1");
list.add(null);
list.add("2");
list.add(null);
System.out.println(list);//[1, null, 2, null]
list.removeAll(Collections.singleton(null));
System.out.println(list);//[1, 2]
}
2️⃣迭代器移除
public static void main(String[] args) {
List<String> list = new ArrayList();
list.add("1");
list.add("2");
list.add(null);
Iterator it = list.iterator();
while (it.hasNext()) {
if (it.next() == null) {
it.remove();
}
}
System.out.println(list);
}
3️⃣创建一个元素为 null 的 list,再 removeAll。
public static void main(String[] args) {
List<String> list = new ArrayList();
list.add("1");
list.add("2");
list.add(null);
List nullList = new ArrayList();
nullList.add(null);
list.removeAll(nullList);
System.out.println(list);
}
4️⃣ 使用 for 循环:这种处理方式是把要处理的集合进行遍历,取出其中不为空的元素,添加到新的集合中。
public static <T> List<T> removeNull(List<? extends T> oldList) {
List<T> listTemp = new ArrayList();
for (int i = 0; i < oldList.size(); i++) {
if (oldList.get(i) != null) {
listTemp.add(oldList.get(i));
}
}
return listTemp;
}