// 在迭代器的当前元素之前添加一个元素,注��是之前
public void add(T e) {
// set 和 remove 操作只能是在迭代器访问过(跳跃过)某元素之后才能进行
isRemoveOrSetLegal = false; // 进行add操作之后,不能立即进行set() 或者 remove()
SequenceListWithIterator.this.insert(e, nextIndex++);
}
}
// 以默认的大小创建顺序表
public SequenceListWithIterator() {
capacity = DEFAULT_SIZE;
elementData = new Object[capacity];
}
// 以指定的大小创建顺序表
public SequenceListWithIterator(int initSize) {
capacity = 1;
while (capacity < initSize)
capacity <<= 1;// 将capacity设置成大于initSize的最小2次方
elementData = new Object[capacity];
}
public ListIterator<T> getIterator() {
return new IteratorForSequenceList();
}
// 获取顺序表中当前元素的个数
public int length() {
return size;
}
// 获取顺序表中索引为 i 处的元素,i表示索引,即以 0 开始
public T get(int i) {
if (i < 0 || i > size - 1)
throw new IndexOutOfBoundsException("顺序表索引越界");
return (T) elementData[i];
}
// 查看顺序表中指定元素的索引,若未找到,返回-1
public int locate(T element) {
for (int i = 0; i < size; i++)
if (elementData[i].equals(element))
return i;
return -1;
}
// 在顺序表的指定索引处插入一个元素
public void insert(T element, int index) {
if (index < 0 || index > size)
throw new IndexOutOfBoundsException("顺序表索引越界");
ensureCapacity(size + 1);// 确保顺序表满时进行扩容,从而能插入元素
// 将指定索引后的所有元素向后移动一个位置
// System.arraycopy(elementData, index, elementData, index + 1, size -
// index);
for (int i = size; i > index; i--)
elementData[i] = elementData[i - 1];
elementData[index] = element;
size++;// 顺序表中的元素个数增1
}
private void ensureCapacity(int minCapacity) {
// 当数组容量已满时,对数组进行扩容。将容量扩展到大于minCapacity的最小2的次方
if (minCapacity > capacity) {
while (capacity < minCapacity)
capacity <<= 1;
elementData = Arrays.copyOf(elementData, capacity);
}
}
// 在顺序表的末尾添加一个元素
public void add(T element) {
insert(element, size);
}
// 删除顺序表中指定索引处的元素
public T delete(int index) {
if (index < 0 || index > size - 1)
throw new IndexOutOfBoundsException("顺序表索引越界");
T oldValue = (T) elementData[index];
int numMoved = size - index - 1;// 计算需要移动的元素个数
if (numMoved > 0) {
System.arraycopy(elementData, index + 1, elementData, index,
numMoved);
}
elementData[--size] = null;// 让垃圾回收器及时回收,避免内存泄露
return oldValue;
}
// 删除顺序表中的最后一个元素
public T remove() {
return delete(size - 1);
}
// 判断顺序表是否为空表
public boolean empty() {
return size == 0;
}