import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.BitSet;
import java.util.Collection;
import java.util.Comparator;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.RandomAccess;
import java.util.Spliterator;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.UnaryOperator;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
public class Test1<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
private static final long serialVersionUID = 242717394679747135L;
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
transient Object[] elementData; // non-private to simplify nested class access
private int size;
/**
* 有变动:
* ensureCapacityInternal->ensureExplicitCapacity++:add(),add(,)addAll(),addAll(,)
* remove(++);
*
* 要求不变:forEach();
*
*/
protected transient int modCount = 0;
/*
* **************0.构造方法:new**************
* (1).构造方法:初始化一个空数组列表:new ArrayList<>();
* (2).构造方法:初始化一个指定长度的Object数组列表:new ArrayList<>(10);
* (3).构造方法:构造一个带有一组指定数据的数组列表 :new ArrayList(list);
*/
/**
* 构造方法:初始化一个空数组列表
*/
public Test1() {
//private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
/**
* 构造方法:初始化一个指定长度的Object数组列表
*/
public Test1(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
//private static final Object[] EMPTY_ELEMENTDATA = {};
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
/**
* 构造方法:构造一个带有一组指定数据的数组列表
*/
public Test1(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}
/*
* **************1.增加元素操作:add**************
* (1).增加指定的单个元素到数组列表尾部:add(E e);
* (2).插入指定的单个元素到数组列表的指定下标([0,数组元素个数])中:add(int index, E element);
* (3).增加指定的一组元素到数组列表尾部:addAll(Collection extends E> c);
* (4).插入指定的一组元素到队列数组的指定下标([0,数组元素个数])中:addAll(int index, Collection extends E> c);
*/
/**
* 增加指定的单个元素到数组列表尾部
*/
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
/**
* 插入指定的单个元素到数组列表的指定下标([0,数组元素个数])中
*/
public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1); // Increments modCount!!
//该数组列表的原下标元素及其之后元素统一后移一位 需要移动的元素个数:size-index
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = element;
size++;
}
/**
* 增加指定的一组元素到数组列表尾部
*/
public boolean addAll(Collection<? extends E> c) {
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacityInternal(size + numNew); // Increments modCount
System.arraycopy(a, 0, elementData, size, numNew);
size += numNew;
return numNew != 0;
}
/**
* 插入指定的一组元素到队列数组的指定下标([0,数组元素个数])中
*/
public boolean addAll(int index, Collection<? extends E> c) {
rangeCheckForAdd(index);
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacityInternal(size + numNew); // Increments modCount
int numMoved = size - index;
if (numMoved > 0)//如果指定下标不是在数组末尾,则需要向后移动numNew位指定下标所在元素及其之后元素
System.arraycopy(elementData, index, elementData, index + numNew, numMoved);
System.arraycopy(a, 0, elementData, index, numNew);
size += numNew;
return numNew != 0;
}
/**
* 数组下标越界检查
*/
private void rangeCheckForAdd(int index) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
//*************************扩容操作*************************************************
/**
* 确保足够的内部容量
*/
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
/**
* 计算数组容量
* @description
* 如果是第一次增加元素且未指定初始容量,则给出默认初始容量10;
* 否则取最低限度容量minCapacity
* @param elementData
* @param minCapacity
* @return
*/
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
//private static final int DEFAULT_CAPACITY = 10;
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
/**
* 确保足够容量,如果不够,则扩容
*/
private void ensureExplicitCapacity(int minCapacity) {
modCount++;//用于fail-fast机制
if (minCapacity - elementData.length > 0)//防止数组容量溢出
grow(minCapacity);
}
/**
* 允许分配给数组的最大容量:Integer.MAX_VALUE - 8
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
/**
* 数组扩容操作
* @description 默认扩容1.5倍,如果低于指定的minCapacity,则以指定的容量minCapacity为准;
* 然后把原数组的元素复制到扩容后的新数组中.
*/
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
/**
* 获取数组的最大容量
*/
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
/*
* **************2.删除元素操作:remove**************
* (1).删除数组列表中的指定下标的元素:E remove(int index);
* (2).删除指定元素第一次出现在该数组列表的所在下标的元素:boolean remove(Object o);
* (3).删除数组列表中指定集合中包含的所有元素:boolean removeAll(Collection> c);
* (4).删除数组列表中指定集合中不包含的所有元素:boolean retainAll(Collection> c);
* (5).删除列表中所有满足过滤器条件的元素:;
*/
/**
* 删除数组列表中的指定下标的元素
*/
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)//只要要删除元素的指定下标不在数组列表的末尾,则需要向前移动一位指定下标之后的元素
System.arraycopy(elementData, index+1, elementData, index, numMoved);
elementData[--size] = null; //元素个数减一,空出的末尾位置置空,减少内存占用
return oldValue;
}
/**
* 删除指定元素第一次出现在该数组列表的所在下标的元素
*/
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;
}
/**
* 快速删除:相比public E remove(int index),省略了"下标越界检查"以及"返回删除的值"
*/
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
}
/**
* 删除数组列表中指定集合中包含的所有元素.
*/
public boolean removeAll(Collection<?> c) {
Objects.requireNonNull(c);
return batchRemove(c, false);
}
/**
* 删除数组列表中指定集合中不包含的所有元素.
*/
public boolean retainAll(Collection<?> c) {
Objects.requireNonNull(c);
return batchRemove(c, true);
}
/**
* 批量删除指定集合中包含或者不包含的所有元素
* @param c
* @param complement false:包含;true:不包含
* @return
*/
private boolean batchRemove(Collection<?> c, boolean complement) {
final Object[] elementData = this.elementData;
int r = 0, w = 0;//r:依次遍历的列表元素的下标;w:不被删除的元素个数
boolean modified = false;
try {
for (; r < size; r++)
if (c.contains(elementData[r]) == complement)
elementData[w++] = elementData[r];//不被删除的元素,储存在数组elementData的w下标的左侧,[0,w)
} finally {
if (r != size) {//如果c.contains(elementData[r])步骤出现异常 ,则会中断剩下的元素遍历操作,此时则只删除已遍历元素中需要被删除的元素
System.arraycopy(elementData, r,//把未被遍历比较的元素前移,覆盖之前已遍历比较且需要删除的元素部分
elementData, w,
size - r);
w += size - r;//把"未被遍历比较的元素"划分到"不被删除的元素"部分
}
if (w != size) {
for (int i = w; i < size; i++)//挨个清空"不被删除的元素"部分之外的所有元素
elementData[i] = null;
modCount += size - w;//记录删除元素个数
size = w;
modified = true;//表示列表的结构被成功修改
}
}
return modified;
}
/**
* 删除列表中所有满足过滤器条件的元素
* @description 该方法执行中时,该列表不能被其他线程修改,否则立即抛出ConcurrentModificationException
*/
// @Override
public boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
//1.查找出所有满足过滤器条件需要被删除的元素
int removeCount = 0;
final BitSet removeSet = new BitSet(size);//可以看做是一个boolean[]数组,用于储存列表中的元素是否会被删除,默认全为false,表示不会被删除
final int expectedModCount = modCount;//记录当前modCount,防止该列表被其他线程修改
final int size = this.size;
for (int i=0; modCount == expectedModCount && i < size; i++) {//modCount == expectedModCount:该流程进行中时,该列表不能被其他线程修改
@SuppressWarnings("unchecked")
final E element = (E) elementData[i];
if (filter.test(element)) {//如果满足指定过滤器条件,则在removeSet对应下标位置设置true,表示此处元素该要被删除
removeSet.set(i);
removeCount++;
}
}
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
//2.删除所有已被查找出的元素
final boolean anyToRemove = removeCount > 0;
if (anyToRemove) {
final int newSize = size - removeCount;//队列的删除元素后的剩余元素个数
for (int i=0, j=0; (i < size) && (j < newSize); i++, j++) {
i = removeSet.nextClearBit(i);//获取从下标i开始的值为false的下标,即为"不需要被删除的元素"下标
elementData[j] = elementData[i];//依次移动到列表的左侧
}
for (int k=newSize; k < size; k++) {//挨个置空删除列表右侧的需要被删除的元素
elementData[k] = null;
}
this.size = newSize;
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
modCount++;//为啥只加1?
}
return anyToRemove;
}
/**
* 删除数组列表中的所有元素
*/
public void clear() {
modCount++;
//对现有元素挨个置空
for (int i = 0; i < size; i++)// clear to let GC do its work
elementData[i] = null;
size = 0;
}
/**
* --------------------------------------------------------------------------
* *************************3.修改元素操作:set************************************
* --------------------------------------------------------------------------
*/
/**
* 用指定元素替换列表数组中指定位置的元素
*/
public E set(int index, E element) {
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
/**
* 将列表数组中的所有元素依次替换为对应元素执行指定操作(operator)后的结果数据
*/
@Override
@SuppressWarnings("unchecked")
public void replaceAll(UnaryOperator<E> operator) {
Objects.requireNonNull(operator);
final int expectedModCount = modCount;
final int size = this.size;
for (int i=0; modCount == expectedModCount && i < size; i++) {
elementData[i] = operator.apply((E) elementData[i]);
}
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
modCount++;
}
/**
* --------------------------------------------------------------------------
* *************************4.查询元素操作:get************************************
* --------------------------------------------------------------------------
*/
/**
* 获取列表数组中的指定下标的元素
*/
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
/**
* 获取列表数组首次出现指定元素的位置(由前至后遍历)
*/
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
/**
* 获取列表数组最后一次出现指定元素的位置(由后至前遍历)
*/
public int lastIndexOf(Object o) {
if (o == null) {
for (int i = size-1; i >= 0; i--)
if (elementData[i]==null)
return i;
} else {
for (int i = size-1; i >= 0; i--)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
/**
* 获取列表数组中是否存在指定元素(indexOf(o) >= 0)
*/
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
/**
* 获取列表数组是否存在指定集合中的所有元素,由java.util.AbstractCollection类中实现
*/
// public boolean containsAll(Collection> c) {
// for (Object e : c)
// if (!contains(e))
// return false;
// return true;
// }
//--------------------------------------------------------------------------
/**
* 检查给定的索引是否在范围内。如果不是,则抛出适当的运行时异常。
* 这个方法不会检查索引是否为负:它总是在数组访问之前使用,
* 如果索引为负,就会抛出ArraylndexOutOfBoundsException异常。
* @param index
*/
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
/**
* 构建一个IndexOutOfBoundsException的详细信息
*/
private String outOfBoundsMsg(int index) {
return "Index: "+index+", Size: "+size;
}
//其他操作
/**
* 获取该ArrayList实例的浅拷贝对象(只复制数据)
*/
public Object clone() {
try {
Test1<?> v = (Test1<?>) super.clone();
v.elementData = Arrays.copyOf(elementData, size);
v.modCount = 0;
return v;
} catch (CloneNotSupportedException e) {
// this shouldn't happen, since we are Cloneable
throw new InternalError(e);
}
}
/**
* 列表数组扩容:如果指定要求容量超出了列表数组的现有数组容量,则执行扩容操作.
* @param minCapacity
*/
public void ensureCapacity(int minCapacity) {
int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
// any size if not default element table
? 0
// larger than default for default empty table. It's already
// supposed to be at default size.
: DEFAULT_CAPACITY;
if (minCapacity > minExpand) {
ensureExplicitCapacity(minCapacity);
}
}
/**
* 获取列表数组是否与指定List集合存在两两之间的每个位置的对应元素都相等,由java.util.AbstractCollection类中实现
*/
// public boolean equals(Object o) {
// if (o == this)
// return true;
// if (!(o instanceof List))
// return false;
//
// ListIterator e1 = listIterator();
// ListIterator> e2 = ((List>) o).listIterator();
// while (e1.hasNext() && e2.hasNext()) {
// E o1 = e1.next();
// Object o2 = e2.next();
// if (!(o1==null ? o2==null : o1.equals(o2)))
// return false;
// }
// return !(e1.hasNext() || e2.hasNext());
// }
/**
* 获取该列表实例的hashCode值
*/
// public int hashCode() {
// int hashCode = 1;
// for (E e : this)
// hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
// return hashCode;
// }
/**
* 依次遍历列表数组的所有元素执行指定操作
* @description 1.不会对元素本身产生任何改变;2.要求遍历过程中不允许对该列表数组有任何结构上的变动
*/
@Override
public void forEach(Consumer<? super E> action) {
Objects.requireNonNull(action);
final int expectedModCount = modCount;
@SuppressWarnings("unchecked")
final E[] elementData = (E[]) this.elementData;
final int size = this.size;
for (int i=0; modCount == expectedModCount && i < size; i++) {
action.accept(elementData[i]);
}
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}
//-----------------------------------------------------------------
/**
* 根据指定的比较器c中的规则对列表数组的所有元素进行排序
*/
@Override
@SuppressWarnings("unchecked")
public void sort(Comparator<? super E> c) {
final int expectedModCount = modCount;
Arrays.sort((E[]) elementData, 0, size, c);
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
modCount++;
}
/**
* 以数组形式获取所有的列表数组元素
*/
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
/**
* 以数组形式获取所有的列表数组元素 一般用法: .toArray(new T[0]);
*/
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {
if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
/**
* 设置列表数组的容量为当前现有元素个数,减少内存占用
*/
public void trimToSize() {
modCount++;
if (size < elementData.length) {
elementData = (size == 0)
? EMPTY_ELEMENTDATA
: Arrays.copyOf(elementData, size);
}
}
/**
* 获取指定下标元素
*/
@SuppressWarnings("unchecked")
E elementData(int index) {
return (E) elementData[index];
}
public boolean isEmpty() {
return size == 0;
}
@Override
public int size() {
// TODO Auto-generated method stub
return 0;
}
/**
* 获取列表数组元素迭代器 该迭代器的所有元素遍历操作不允许存在其他线程对该列表数组的结构进行变动
*/
public Iterator<E> iterator() {
return new Itr();
}
public ListIterator<E> listIterator() {
return new ListItr(0);
}
public ListIterator<E> listIterator(int index) {
if (index < 0 || index > size)
throw new IndexOutOfBoundsException("Index: "+index);
return new ListItr(index);
}
/**
* AbstractList.Itr的优化版本
*/
private class Itr implements Iterator<E> {
int cursor; // 下一个要遍历的元素的下标
int lastRet = -1; // 记录当前遍历元素的下标 用于remove(),如果当前遍历元素被remove删除,
// 则为-1,标志当前下标的元素是未被遍历的元素,目前可被remove删除
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 = Test1.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;//继续指向下一个要遍历的元素的下标
return (E) elementData[lastRet = i];//lastRet = i 记录当前遍历元素的下标
}
/**
* 删除当前被遍历的元素
*/
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
Test1.this.remove(lastRet);
cursor = lastRet;//由于列表数组后面未被遍历的元素的下标统一进一位,所以当前下标即为下一个即将被遍历的元素
lastRet = -1;//-1,标志当前下标的元素是未被遍历的元素,目前可被remove删除
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
/**
* 依次遍历剩下的未被遍历的元素执行指定操作
*/
@Override
@SuppressWarnings("unchecked")
public void forEachRemaining(Consumer<? super E> consumer) {
Objects.requireNonNull(consumer);
final int size = Test1.this.size;
int i = cursor;
if (i >= size) {
return;
}
final Object[] elementData = Test1.this.elementData;
if (i >= elementData.length) {
throw new ConcurrentModificationException();
}
while (i != size && modCount == expectedModCount) {
consumer.accept((E) elementData[i++]);
}
cursor = i;
lastRet = i - 1;
checkForComodification();
}
/**
* 检测是否有其他线程改动了该列表数组结构
*/
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
/**
* AbstractList.ListItr的优化版本
*/
private class ListItr extends Itr implements ListIterator<E> {
ListItr(int index) {
super();
cursor = index;
}
public boolean hasPrevious() {
return cursor != 0;
}
public int nextIndex() {
return cursor;
}
public int previousIndex() {
return cursor - 1;
}
@SuppressWarnings("unchecked")
public E previous() {
checkForComodification();
int i = cursor - 1;
if (i < 0)
throw new NoSuchElementException();
Object[] elementData = Test1.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i;
return (E) elementData[lastRet = i];
}
public void set(E e) {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
Test1.this.set(lastRet, e);
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
public void add(E e) {
checkForComodification();
try {
int i = cursor;
Test1.this.add(i, e);
cursor = i + 1;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
}
/**
* 返回在指定的fromIndex(包含的)和toIndex(独占的)之间的列表部分的视图。
* (如果fromIndex和toIndex相等,返回的列表为空。)
* 返回的列表由该列表支持,因此返回列表中的非结构性更改反映在该列表中,反之亦然。
* 返回的列表支持所有可选的列表操作。该方法消除了显式范围操作的需要(数组通常存在的排序)。
* 任何需要列表的操作都可以通过传递子列表视图而不是整个列表来用作范围操作。
* 例如,下面的习惯用法从列表中删除了一系列元素:列表。分表(,)。
* 明确的();indexof (Object)和last indexof (Object)可以构造类似的习惯用法,集合类中的所有算法都可以应用于子列表。
* 如果后台列表(也就是这个列表)在结构上被修改,而不是通过返回的列表,那么这个方法返回的列表的语义就没有定义。
* (结构修改是指改变列表的大小,或者以一种可能产生不正确结果的方式扰乱列表。
*/
public List<E> subList(int fromIndex, int toIndex) {
subListRangeCheck(fromIndex, toIndex, size);
return new SubList(this, 0, fromIndex, toIndex);
}
/**
* 检查是否参数是否满足条件:0 < fromIndex < toIndex < size
* @param fromIndex
* @param toIndex
* @param size
*/
static void subListRangeCheck(int fromIndex, int toIndex, int size) {
if (fromIndex < 0)
throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
if (toIndex > size)
throw new IndexOutOfBoundsException("toIndex = " + toIndex);
if (fromIndex > toIndex)
throw new IllegalArgumentException("fromIndex(" + fromIndex +
") > toIndex(" + toIndex + ")");
}
/**
* 数组列表的子数组列表类???
*/
private class SubList extends AbstractList<E> implements RandomAccess {
/** 源数据 */
private final AbstractList<E> parent;
/** */
private final int parentOffset;
/** */
private final int offset;
/** */
int size;
/**
* 要求不变:E set(int index, E e)、
*
* 有改动:
*/
protected transient int modCount = 0;
/**
*
* @param parent 源数据
* @param offset 子列表的元素下标与对应在源列表的元素的下标之差
* @param fromIndex
* @param toIndex
*/
SubList(AbstractList<E> parent,
int offset, int fromIndex, int toIndex) {
this.parent = parent;
this.parentOffset = fromIndex;
this.offset = offset + fromIndex;
this.size = toIndex - fromIndex;
this.modCount = Test1.this.modCount;
}
public E set(int index, E e) {
rangeCheck(index);
checkForComodification();
E oldValue = Test1.this.elementData(offset + index);
Test1.this.elementData[offset + index] = e;
return oldValue;
}
public E get(int index) {
rangeCheck(index);
checkForComodification();
return Test1.this.elementData(offset + index);
}
public int size() {
checkForComodification();
return this.size;
}
public void add(int index, E e) {
rangeCheckForAdd(index);
checkForComodification();
parent.add(parentOffset + index, e);
this.modCount = parent.modCount;
this.size++;
}
public E remove(int index) {
rangeCheck(index);
checkForComodification();
E result = parent.remove(parentOffset + index);
this.modCount = parent.modCount;
this.size--;
return result;
}
protected void removeRange(int fromIndex, int toIndex) {
checkForComodification();
parent.removeRange(parentOffset + fromIndex,
parentOffset + toIndex);
this.modCount = parent.modCount;
this.size -= toIndex - fromIndex;
}
public boolean addAll(Collection<? extends E> c) {
return addAll(this.size, c);
}
public boolean addAll(int index, Collection<? extends E> c) {
rangeCheckForAdd(index);
int cSize = c.size();
if (cSize==0)
return false;
checkForComodification();
parent.addAll(parentOffset + index, c);
this.modCount = parent.modCount;
this.size += cSize;
return true;
}
public Iterator<E> iterator() {
return listIterator();
}
public ListIterator<E> listIterator(final int index) {
checkForComodification();
rangeCheckForAdd(index);
final int offset = this.offset;
return new ListIterator<E>() {
int cursor = index;
int lastRet = -1;
int expectedModCount = Test1.this.modCount;
public boolean hasNext() {
return cursor != SubList.this.size;
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= SubList.this.size)
throw new NoSuchElementException();
Object[] elementData = Test1.this.elementData;
if (offset + i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[offset + (lastRet = i)];
}
public boolean hasPrevious() {
return cursor != 0;
}
@SuppressWarnings("unchecked")
public E previous() {
checkForComodification();
int i = cursor - 1;
if (i < 0)
throw new NoSuchElementException();
Object[] elementData = Test1.this.elementData;
if (offset + i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i;
return (E) elementData[offset + (lastRet = i)];
}
@SuppressWarnings("unchecked")
public void forEachRemaining(Consumer<? super E> consumer) {
Objects.requireNonNull(consumer);
final int size = SubList.this.size;
int i = cursor;
if (i >= size) {
return;
}
final Object[] elementData = Test1.this.elementData;
if (offset + i >= elementData.length) {
throw new ConcurrentModificationException();
}
while (i != size && modCount == expectedModCount) {
consumer.accept((E) elementData[offset + (i++)]);
}
// update once at end of iteration to reduce heap write traffic
lastRet = cursor = i;
checkForComodification();
}
public int nextIndex() {
return cursor;
}
public int previousIndex() {
return cursor - 1;
}
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
SubList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = Test1.this.modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
public void set(E e) {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
Test1.this.set(offset + lastRet, e);
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
public void add(E e) {
checkForComodification();
try {
int i = cursor;
SubList.this.add(i, e);
cursor = i + 1;
lastRet = -1;
expectedModCount = Test1.this.modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
final void checkForComodification() {
if (expectedModCount != Test1.this.modCount)
throw new ConcurrentModificationException();
}
};
}
public List<E> subList(int fromIndex, int toIndex) {
subListRangeCheck(fromIndex, toIndex, size);
return new SubList(this, offset, fromIndex, toIndex);
}
/**
* 检查: 0 < index <= size
* @param index
*/
private void rangeCheck(int index) {
if (index < 0 || index >= this.size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
/**
* 检查参数:index是否满足:0 < index < size
* @param index
*/
private void rangeCheckForAdd(int index) {
if (index < 0 || index > this.size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
/**
* "数组下标:index越界"的异常提示信息
* @param index
* @return
*/
private String outOfBoundsMsg(int index) {
return "Index: "+index+", Size: "+this.size;
}
/**
* 检查是否出现有其他线程对改数组列表进行了变动
*/
private void checkForComodification() {
if (Test1.this.modCount != this.modCount)
throw new ConcurrentModificationException();
}
public Spliterator<E> spliterator() {
checkForComodification();
return new ArrayListSpliterator<E>(Test1.this, offset,
offset + this.size, this.modCount);
}
}
/**
* 在此列表中的元素上创建一个Spliterator。
*/
@Override
public Spliterator<E> spliterator() {
return new ArrayListSpliterator<>(this, 0, -1, 0);
}
/** 基于索引的2次拆分,延迟初始化Spliterator */
static final class ArrayListSpliterator<E> implements Spliterator<E> {
/*
* If ArrayLists were immutable, or structurally immutable (no
* adds, removes, etc), we could implement their spliterators
* with Arrays.spliterator. Instead we detect as much
* interference during traversal as practical without
* sacrificing much performance. We rely primarily on
* modCounts. These are not guaranteed to detect concurrency
* violations, and are sometimes overly conservative about
* within-thread interference, but detect enough problems to
* be worthwhile in practice. To carry this out, we (1) lazily
* initialize fence and expectedModCount until the latest
* point that we need to commit to the state we are checking
* against; thus improving precision. (This doesn't apply to
* SubLists, that create spliterators with current non-lazy
* values). (2) We perform only a single
* ConcurrentModificationException check at the end of forEach
* (the most performance-sensitive method). When using forEach
* (as opposed to iterators), we can normally only detect
* interference after actions, not before. Further
* CME-triggering checks apply to all other possible
* violations of assumptions for example null or too-small
* elementData array given its size(), that could only have
* occurred due to interference. This allows the inner loop
* of forEach to run without any further checks, and
* simplifies lambda-resolution. While this does entail a
* number of checks, note that in the common case of
* list.stream().forEach(a), no checks or other computation
* occur anywhere other than inside forEach itself. The other
* less-often-used methods cannot take advantage of most of
* these streamlinings.
*/
/*
如果数组列表是不可变的,或者在结构上是不可变的(没有添加、删除等),
我们可以使用Arrays.spliterator实现它们的spliterator。
相反,我们在遍历过程中检测到尽可能多的干扰,而不牺牲太多的性能。
我们主要依靠modCounts。
这些方法不能保证检测到并发冲突,而且有时对于线程内干扰过于保守,
但是在实践中检测到足够多的问题是值得的。
为了实现这一点,我们(1)延迟初始化fence和expectedModCount,
直到我们需要提交到我们检查的状态的最新点;从而提高精度。
(这并不适用于sublist,它使用当前的非延迟值创建拆分器)。
我们只在forEach(性能最敏感的方法)的末尾执行一个ConcurrentModificationException检查。
使用forEach(与迭代器相反)时,通常只能检测动作之后的干扰,而不能检测动作之前的干扰。
进一步的cme触发检查适用于所有其他可能违反假设的情况,
例如null或太小的elementData数组(给定其大小()),这只能由于干扰而发生。
这允许forEach的内部循环无需任何进一步的检查就可以运行,并简化了lambda解析。
虽然这需要进行大量的检查,但请注意,在list.stream().forEach(a)的常见情况下,
除了在forEach内部之外,任何地方都不会发生检查或其他计算。
其他不太常用的方法不能充分利用这些流线型。
*/
/** 底层数据结构 */
private final Test1<E> list;
/** 下一个即将被访问/遍历元素的下标,在进行advance/split操作时被修改 */
private int index;
/** 围栏:该解析器实例允许访问的数组列表中的最后一个元素的下标 */
private int fence;
/** 用于检查list数据是否同步 */
private int expectedModCount;
/**
* 创建覆盖给定范围的新拆分器
* @param list
* @param origin
* @param fence 若为-1,则表示list中的origin下标及其之后的所有元素均可被访问
* @param expectedModCount
* @description new ArrayListSpliterator<>(this, 0, -1, 0);
*/
ArrayListSpliterator(Test1<E> list, int origin, int fence,
int expectedModCount) {
this.list = list;//默认被ArrayList实例调用的情况下不会为null
this.index = origin;
this.fence = fence;
this.expectedModCount = expectedModCount;
}
/**
* 获取fence
* @return
*/
private int getFence() {
int hi; // (a specialized variant appears in method forEach)(forEach方法中出现了一个专门化的变体)
Test1<E> lst;
if ((hi = fence) < 0) {//只在第一次使用时初始化fence大小:为list的元素个数,以及初始化expectedModCount = lst.modCount;
if ((lst = list) == null)
hi = fence = 0;
else {
expectedModCount = lst.modCount;
hi = fence = lst.size;
}
}
return hi;
}
/**
* 将当前数组列表剩余未被遍历元素的均分为两半(前半部分,后半部分);
* 1.获取一个剩余未被遍历元素为前半部分的解析器实例;
* 2.当前解析器实例下一个被访问/遍历元素的下标移动到后半部分的首个元素下标
*/
public ArrayListSpliterator<E> trySplit() {
int hi = getFence(), lo = index, mid = (lo + hi) >>> 1;//取当前遍历元素的下标与列表数组元素个数之和的平均值
return (lo >= mid) ? null : // 将范围分成两半,除非太小
new ArrayListSpliterator<E>(list, lo, index = mid,
expectedModCount);
}
/**
* 对当前被访问/遍历元素执行指定操作
*/
public boolean tryAdvance(Consumer<? super E> action) {
if (action == null)
throw new NullPointerException();
int hi = getFence(), i = index;
if (i < hi) {
index = i + 1;//1.移动到下一个即将被访问/遍历元素的下标
@SuppressWarnings("unchecked") E e = (E)list.elementData[i];//2.取当前被访问/遍历元素
action.accept(e);//3.对当前被访问/遍历元素执行指定操作
if (list.modCount != expectedModCount)//4.检查是否发生同步修改
throw new ConcurrentModificationException();
return true;
}
return false;
}
/**
* 在当前线程中依次对每个剩余元素执行给定的操作,直到所有元素都被处理或操作抛出异常。
* 如果这个Spliterator是ORDERED,操作将按照遇到的顺序执行。
* 由动作抛出的异常被转发给调用者。
*/
public void forEachRemaining(Consumer<? super E> action) {
int i, hi, mc; // hoist accesses and checks from loop 从循环中提升访问和检查
Test1<E> lst; Object[] a;
if (action == null)
throw new NullPointerException();
if ((lst = list) != null && (a = lst.elementData) != null) {
if ((hi = fence) < 0) {//此时fence=-1,表示list中的origin下标及其之后的所有元素均可被访问
mc = lst.modCount;
hi = lst.size;//设置可访问元素的最大范围:
}
else
mc = expectedModCount;
if ((i = index) >= 0 && (index = hi) <= a.length) {//
for (; i < hi; ++i) {//依次遍历剩余可遍历元素,使执行指定操作action
@SuppressWarnings("unchecked") E e = (E) a[i];
action.accept(e);
}
if (lst.modCount == mc)//lst.modCount == list.modCount == mc,数据同步,正常返回
return;
}
}
throw new ConcurrentModificationException();//lst.modCount == list.modCount != mc,数据不同步,抛异常
}
public long estimateSize() {
return (long) (getFence() - index);
}
/**
* 返回此Spliterator及其元素的一组特征。
* 结果被表示为来自ORDERED, DISTINCT, SORTED, size, NONNULL, IMMUTABLE, CONCURRENT, subzed的或值。
* 在调用trySplit之前或在调用之间对给定的spliterator重复调用characters()应该总是返回相同的结果。
* 如果Spliterator报告一组不一致的特征(无论是单个调用返回的特征还是跨多个调用返回的特征),
* 则无法保证使用该Spliterator进行任何计算。
*/
public int characteristics() {
return Spliterator.ORDERED | Spliterator.SIZED | Spliterator.SUBSIZED;
}
}
/**
* java.util.AbstractCollection.toString()
* 获取包含该集合的所有元素的字符串
*/
public String toString() {
Iterator<E> it = iterator();
if (! it.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = it.next();
sb.append(e == this ? "(this Collection)" : e);
if (! it.hasNext())
return sb.append(']').toString();
sb.append(',').append(' ');
}
}
public static void main(String[] args) {
java.util.ArrayList<Integer> list = new java.util.ArrayList<Integer>();
list.add(1);
list.add(1);
list.add(2);
list.add(3);
list.add(1);
list.add(1);
Test1<Integer> list1 = new Test1<Integer>(list);
list1.removeIf( new Predicate<Integer>() {
@Override
public boolean test(Integer t) {
return t==1;
}
} );
System.out.println(list.toString());
list.set(1, 1);
}
}