java 中删除list元素的四种方法(remove)
remove()方法有两种移除的方式:
1、根据下标移除,public E remove(int index)
2、根据内容移除,public boolean remove(Object o)
要注意自己调用的remove()方法中的,传入的是int类型还是一个对象。
List 删除元素的逻辑是将目标元素之后的元素往前移一个索引位置,最后一个元素置为 null,同时 size - 1;所以按照从大往小的方向删除不容易出错
java 中list进行动态remove处理
删除list元素的三种正确方法
错误的方式1
for(int i = 0, len = list.size(); i < len; i++){
if(list.get(i) == 1) {
list.remove(i);
}
}
这样会抛出异常
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
at java.util.ArrayList.RangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
原因:数组越界。删除元素之后未改变相应角标,遍历到最后一个的时候就会找不到,抛出这个异常。
错误的方式2
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
int i = iterator.next();
if(i == 1){
list.remove(i); //错误,ConcurrentModificationException异常。
}
}
出现如下异常:
Exception in thread “main” java.util.ConcurrentModificationException
at java.util.ArrayListItr.checkForComodification(ArrayList.java:859)atjava.util.ArrayListItr.checkForComodification(ArrayList.java:859)atjava.util.ArrayListItr.next(ArrayList.java:831)
at com.ips.list.ArrayListRemove.remove31(ArrayListRemove.java:109)
原因:执行 list.remove(item);对 list 对象的 modCount 值进行了修改,而 list 对象的迭代器的 expectedModCount 值未进行修改。因此抛出了ConcurrentModificationException异常。
正确做法1:删除下标以及定位到遍历位置
for(int i = 0, len = list.size(); i < len; i++){
if(list.get(i) == 1){
list.remove(i);
len--;
i--;
}
}
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
int i = iterator.next();
if(i == 1){
iterator.remove(); //正确
}
}
//remove13和remove14完全一样,均可正确删除。
public static void remove13(List<String> list, String target){
int size = list.size();
for(int i = size - 1; i >= 0; i--){
String item = list.get(i);
if(target.equals(item)){
list.remove(item);
}
}
print(list);
}
public static void remove14(List<String> list, String target){
for(int i = list.size() - 1; i >= 0; i--){
String item = list.get(i);
if(target.equals(item)){
list.remove(item);
}
}
print(list);
}
正确做法4:通过 CopyOnWriteArrayList 解决 List的并发问题
public static void remove22(ArrayList<String> list, String target) {
final CopyOnWriteArrayList<String> cowList = new CopyOnWriteArrayList<String>(list);
for (String item : cowList) {
if (item.equals(target)) {
cowList.remove(item);
}
}
print(cowList);
}