62,628
社区成员
发帖
与我相关
我的任务
分享
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Predicate;
/**
*
*/
public class ArrayListDemo {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(2);
list.add(6);
for (Integer number : list) {
System.out.println(number);
}
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer number = iterator.next();
if (number.equals(4)) {
try {
iterator.remove();
} catch (Exception e) {
e.printStackTrace();
}
}
}
list.removeIf(new Predicate<Integer>() {
@Override
public boolean test(Integer number) {
return (number.equals(2) || number.equals(4));
}
});
for (Integer number : list) {
System.out.println(number);
}
}
}
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class ListTest {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
// for (Integer i : list) {
// System.out.println(i);
// list.remove(i);
// }
List<Integer> list2 = new CopyOnWriteArrayList<>();
list2.add(1);
list2.add(2);
list2.add(3);
list2.add(4);
list2.add(5);
for (Integer i : list2) {
System.out.println(i);
list.remove(i);
}
}
}
public E remove(int index) {
// 先检查下标索引是是否越界
rangeCheck(index);
// ArrayList的修改次数加1
modCount++;
// 获取索引对应的元素值
E oldValue = elementData(index);
// 获取删除元素后,需要移动的元素的个数
int numMoved = size - index - 1;
if (numMoved > 0)
// 将元素进行移动拷贝
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
// 最后将多出的位置设置为空,这样说明是没有引用的对象了
elementData[--size] = null; // Let gc do its work
// 返回删除的旧值
return oldValue;
}
//ArrayList中Iterator迭代器的实现
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;
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];
}
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
list.remove() 这个操作,导致modCount++这步操作,将ArrayList的修改次数加1。
在初始化Itr时expectedModCount = modCount = 8 。
在执行next方法的第一步先进行了checkForComodification方法的检查,因为我们之前进行了remove操作,那么modCount数值减一,实际modCount = 7 。
modCount 数值和expectedModCount 数值不相等,抛出ConcurrentModificationException异常。

List<Integer> list = new ArrayList<>();
list.add(3);
list.add(23);
list.add(6);
list.add(8);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
list.remove(i);
i--;
} List<Integer> list = new ArrayList<>();
list.add(3);
list.add(23);
list.add(6);
list.add(8);
List<Integer> removeList = new ArrayList<>();
for (Integer integer : list) {
System.out.println(integer);
removeList.add(integer);
}
list.removeAll(removeList); List<Integer> list = new ArrayList<>();
list.add(3);
list.add(23);
list.add(6);
list.add(8);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
iterator.remove();
}常用的几种方式