/**
* Returns an iterator over the elements in this list in proper sequence.
*
* <p>This implementation returns a straightforward implementation of the
* iterator interface, relying on the backing list's {@code size()},
* {@code get(int)}, and {@code remove(int)} methods.
*
* <p>Note that the iterator returned by this method will throw an
* {@code UnsupportedOperationException} in response to its
* {@code remove} method unless the list's {@code remove(int)} method is
* overridden.
*
* <p>This implementation can be made to throw runtime exceptions in the
* face of concurrent modification, as described in the specification
* for the (protected) {@code modCount} field.
*
* @return an iterator over the elements in this list in proper sequence
*
* @see #modCount
*/
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
/**
* Index of element to be returned by subsequent call to next.
*/
int cursor = 0;
/**
* Index of element returned by most recent call to next or
* previous. Reset to -1 if this element is deleted by a call
* to remove.
*/
int lastRet = -1;
/**
* The modCount value that the iterator believes that the backing
* List should have. If this expectation is violated, the iterator
* has detected concurrent modification.
*/
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size();
}
public E next() {
checkForComodification();
try {
E next = get(cursor);
lastRet = cursor++;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
public void remove() {
if (lastRet == -1)
throw new IllegalStateException();
checkForComodification();
try {
AbstractList.this.remove(lastRet);
if (lastRet < cursor)
cursor--;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
}
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
private class ListItr extends Itr implements ListIterator<E> {
ListItr(int index) {
cursor = index;
}
public boolean hasPrevious() {
return cursor != 0;
}
public E previous() {
checkForComodification();
try {
int i = cursor - 1;
E previous = get(i);
lastRet = cursor = i;
return previous;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
public int nextIndex() {
return cursor;
}
public int previousIndex() {
return cursor-1;
}
public void set(E e) {
if (lastRet == -1)
throw new IllegalStateException();
checkForComodification();
try {
AbstractList.this.set(lastRet, e);
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
public void add(E e) {
checkForComodification();
try {
AbstractList.this.add(cursor++, e);
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
}
分享到:
相关推荐
### JAVA初学教程之AbstractList详解 对于Java初学者来说,理解Java集合框架的基本组成部分及其工作原理至关重要。本文将深入探讨`AbstractList`类的重要性和使用场景,帮助初学者掌握如何利用`AbstractList`来创建...
`AbstractList`类是`List`接口的一个抽象实现,它为所有`List`子类提供了一个基本框架。在`AbstractList`类中,迭代器是由内部类`Itr`实现的。下面详细介绍`Itr`类的关键部分。 1. **构造函数**: - `AbstractList...
`AbstractList`可能是作为`List`接口的一个抽象实现,提供了一些默认行为,而具体的数据结构实现(如`seqList.java`)则可能继承自`AbstractList`,覆盖或实现其方法,以满足特定的需求。 7. **类和对象**:每个`....
每个 PDF 文件都可能是一个专题,比如 `AbstractList.pdf` 可能详细介绍了 `AbstractList` 类的设计和使用,而 `java.io.pdf` 可能全面讲解了 Java I/O 流的用法和最佳实践。通过学习这些文档,开发者可以深入理解 ...
`AbstractList`提供了一个`iterator()`方法,返回一个`Itr`对象,`Itr`是`AbstractList`的内部类,实现了`Iterator`接口,负责具体的遍历逻辑。 #### 结论 迭代器模式在Java中的应用非常广泛,尤其在集合框架中,...
在继承关系方面,`ArrayList`继承自`AbstractList`,`AbstractList`又继承自`AbstractCollection`,同时`ArrayList`实现了`List`接口。`List`接口继承自`Collection`接口,`Collection`是最顶级的集合接口。这种层次...
例如,`java.util.AbstractList`是集合框架中的一个抽象类,提供了列表操作的部分实现,如`ArrayList`就是基于它进行扩展的。 在Java中,类通过`implements`关键字实现接口,通过`extends`关键字继承抽象类。例如,...
* AbstractSequentialList抽象类,为了被类集使用并扩展AbstractList,该类集使用连续而不是随机方式访问其元素 * ArrayList通过扩展AbstractList来实现动态数组 * LinkedList通过继承AbstractSequentialList来实现...
此外,Java的`java.util.ArrayList`和`java.util.LinkedList`都是抽象类`java.util.AbstractList`的子类,它们都实现了`AbstractList`提供的接口和部分方法,但各自的实现方式不同,这体现了抽象类在代码结构和复用...
`AbstractList`抽象类提供了创建迭代器的工厂方法,这样每个具体的容器类(如ArrayList、LinkedList等)可以通过继承`AbstractList`并实现必要的方法来创建自己的迭代器。 迭代器模式的一个重要特性是多态迭代,这...
public class Vector<E> extends AbstractList<E> implements List, RandomAccess, Cloneable, java.io.Serializable { ... } ``` Vector 底层也是一个对象数组,protected Object\[] elementData; 这个数组用于...
例如,Vector、ArrayList既继承了AbstractList又实现了List接口,这是因为接口实现提供了默认实现,而直接继承AbstractList可以获取更多的抽象方法实现,节省代码量。装饰者模式在JDK中广泛应用,如Collections....
LinkedList的继承体系中,它继承了AbstractSequentialList和AbstractList,实现了List、Queue和Deque接口。它的主要属性包括元素个数size、链表首节点first和链表尾节点last。 在LinkedList的源码中,我们可以看到...
`AbstractCollection`、`AbstractList`、`AbstractMap`和`AbstractSet`是集合框架中的抽象类,它们为特定类型的集合提供了基本操作的骨架实现。例如,`AbstractList`为实现列表接口(如ArrayList和LinkedList)提供...
- **AbstractList**:继承AbstractCollection并实现了大部分List接口功能。 - **AbstractSequentialList**:继承AbstractList,适合顺序访问而非随机访问。 - **AbstractSet**:实现了Set接口的一部分。 - **...
- 通常,开发者应优先考虑使用已有的容器实现,但如果需要特定行为,可以创建自定义容器类,继承自AbstractCollection、AbstractList、AbstractSet或AbstractMap,以便利用已实现的方法。 总结来说,Java对象容器...
2. **集合框架**:Java集合框架包括AbstractCollection、AbstractList、AbstractSet等,这些抽象类提供了基本的集合操作,并为创建自定义集合类提供了便利。例如,AbstractList允许开发者实现列表接口而不必完全实现...
- **描述**:`AbstractCollection` 是 `Collection` 接口的基本实现,它是 `AbstractList` 和 `AbstractSet` 的超类。如果你需要创建自定义的集合类型,可以考虑从 `AbstractCollection` 继承。 #### 5. **...
而由于继承自AbstractList,ArrayList可以直接使用索引访问其元素,实现了RandomAccess接口,表明它支持高效的随机访问。 总之,Java.util.ArrayList是Java编程中非常重要的数据结构,它提供了一种动态、高效的方式...
- `Vector` 类:`Vector` 是一个线程安全的列表实现,它继承自 `AbstractList` 并实现了 `List` 接口。由于它的操作是同步的,因此在多线程环境中更安全,但在单线程环境下,它的性能通常比非同步的 `ArrayList` 差...