一、ListRemove用法
List.remove(object o)
在Java的List接口中,remove()
方法是一个非常基础的方法。它的作用是将列表中的一个元素移除并返回这个被移除的元素。这个方法有一个参数,这个参数就是需要被移除的元素o
。
举例来说,假设我们有一个String类型的List列表names
,列表中包含字符串"John"、"Mike"、"Lucy",我们可以使用如下代码将"Mike"这个字符串从列表中移除:
List<String> names = new ArrayList<>();
names.add("John");
names.add("Mike");
names.add("Lucy");
names.remove("Mike");
二、ListRemoveAt
list.remove(int index)
remove()
方法也可以通过传入元素的下标来移除元素。如果我们想要移除名字列表的第二个元素"Mike",我们可以使用remove()
方法,并传入下标1:
List<String> names = new ArrayList<>();
names.add("John");
names.add("Mike");
names.add("Lucy");
names.remove(1);
三、ListRemove不掉
有时候我们会遇到一个非常诡异的情况:调用remove()
方法移除元素,但元素并没有被移除。这种情况通常是因为我们在进行迭代的时候直接使用了List对象,而不是使用迭代器遍历List。
下面的代码就是一个反例:
List<String> names = new ArrayList<>();
names.add("John");
names.add("Mike");
names.add("Lucy");
for (String name : names) {
if (name.equals("Mike")) {
names.remove(name);
}
}
上述代码将会抛出ConcurrentModificationException
异常,应该使用Iterator
(迭代器)来遍历List,并在需要移除元素时使用迭代器的remove()
方法:
List<String> names = new ArrayList<>();
names.add("John");
names.add("Mike");
names.add("Lucy");
Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {
String name = iterator.next();
if (name.equals("Mike")) {
iterator.remove();
}
}
四、ListRemoveIf
list.removeIf(Predicate<? super E> filter)
Java 8引入了一个新的removeIf()
方法,可以方便地根据一个条件移除集合中的元素。这个方法接收一个Predicate
类型的参数,这个参数表示移除哪些元素。下面的例子中移除了所有的偶数元素:
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
numbers.removeIf(n -> (n % 2 == 0));
五、remove方法
Collections.sort(List<T>, Comparator<? super T>)
我们可以通过remove()
方法,将列表中符合条件的元素全部移除。下面的例子中,移除了列表中长度为3的字符串:
List<String> names = new ArrayList<>();
names.add("John");
names.add("Mike");
names.add("Lucy");
names.removeIf(n -> n.length() == 3);
六、List的remove方法参数
boolean remove(Object o)
在List接口中,除了remove()
方法以外还有一个方法,这个方法的参数是一个Object类型。和根据下标索引删除不同,这里需要传入的是列表中实际存在的元素,若元素没有找到,则返回false
。
List<String> names = new ArrayList<>();
names.add("John");
names.add("Mike");
names.add("Lucy");
names.remove("Jack"); // 返回false
七、List集合remove方法
list.removeAll(Collection<?> c)
removeAll()
方法可以将一个集合中的所有元素都从另一个集合中移除。下面的例子将移除列表a
中和列表b
中相同的元素:
List<String> a = new ArrayList<>();
a.add("John");
a.add("Ben");
a.add("Mike");
List<String> b = new ArrayList<>();
b.add("John");
b.add("Alice");
a.removeAll(b); // [Ben, Mike]
八、实现List的remove方法
除了基本的List.remove()
方法以外,有时我们也需要实现自己的remove
方法。例如,在自己的LinkedList
类中重写remove
方法:
@Override
public boolean remove(Object o) {
Node<E> current = first;
while (current != null) {
if ((o == null && current.element == null) || (o != null && o.equals(current.element))) {
unlink(current);
size--;
return true;
}
current = current.next;
}
return false;
}
九、ListRemove方法
remove
方法可以移除List中的某个元素。如果需要删除List中的某个子集合中的所有元素,可以这样做:
List<String> names = new ArrayList<>();
names.add("John");
names.add("Mike");
names.add("Lucy");
List<String> subList = new ArrayList<>();
subList.add("John");
subList.add("Mike");
names.removeAll(subList);
十、ListRemove报错
有时,List.remove()
方法运行时会报错,最常见的错误是IndexOutOfBoundsException
。这种异常通常是在通过下标索引删除元素时出现的。
下面的例子将会抛出IndexOutOfBoundsException
异常:
List<String> names = new ArrayList<>();
names.add("John");
names.remove(1);
在这个例子中,names
列表中只有一个元素,所以当我们试图删除下标为1的元素时就会抛出异常。正确的方法应该是使用下标0来删除:
List<String> names = new ArrayList<>();
names.add("John");
names.remove(0);