我是靠谱客的博主 懦弱硬币,最近开发中收集的这篇文章主要介绍Java——Java基础之ArrayList中元素的删除操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1. 问题记录

public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
for (String str : list){
if (str=="d"){
list.remove(str);
}
}
System.out.println(list);
}
//报错
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at com.cc.JVM.memory.test.main(test.java:21)

2. 原因

  • 进入 remove 方法,在 fastRemove 中执行了 modCount++
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
//...
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
private void fastRemove(int index) {
modCount++;
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
}
//...
}
  • 在下次迭代中,先执行 ItrhasNext 判断是否有下一个,有则执行 next
  • 首先执行 checkForComodification 判断 if (modCount != expectedModCount),但是 expectedModCount = modCount ,而之前的删除导致modCount++,从而抛出异常
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
private class Itr implements Iterator<E> {
int cursor;
// index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
Itr() {}
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
//...
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
}

3. 解决

  • 使用 for(int i=0;i<n;i++)
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
for (int i=0;i<list.size();i++){
if (list.get(i)=="d"){
list.remove(i);
}
}
System.out.println(list);
}
  • 使用 Iterator
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
Iterator<String> it = list.iterator() ;
while(it.hasNext()) {
if(it.next()=="c") {
it.remove();
}
}
System.out.println(list);
}

最后

以上就是懦弱硬币为你收集整理的Java——Java基础之ArrayList中元素的删除操作的全部内容,希望文章能够帮你解决Java——Java基础之ArrayList中元素的删除操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部