关于Java迭代的问题。我(有点)熟悉接口Iterator,ListIterator和Iterable,即我理解它们背后的想法。但这也是我的问题所在。
如果我有一个ArrayList实例,那么我们只需要调用这个实例'list',如果我然后调用'list.listIterator()',那么哪个CLASS会生成(即返回)对象?
我知道它必须是一个实现接口ListIterator的类,但是它仍然没有告诉我它属于哪个实际的特定CLASS。而在线文档似乎也没有告诉我这一点。或者它只是一个“内部” - 因此匿名/未命名 - Java类?
谢谢! 荷兰。
答案 0 :(得分:1)
你可以通过
找到答案System.out.println(new ArrayList<String>().listIterator().getClass());
您会看到该类在ArrayList
内声明,并被称为ListItr
。
是private
。这样做是有充分理由的。首先,它使ArrayList
的编写者能够在不破坏任何人的代码的情况下更改实现。而且,你不需要关心实际的课程;重要的是它遵守ListIterator
的合同。
答案 1 :(得分:1)
在线文档告诉您可以从API中获得什么以及您可以做什么,您可以查看源代码以找到所需的详细信息,所以在这里:
来自Java源代码:
public ListIterator<E> listIterator(int index) {
if (index < 0 || index > size)
throw new IndexOutOfBoundsException("Index: "+index);
return new ListItr(index);
}
上面说明你将获得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 = ArrayList.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 {
ArrayList.this.set(lastRet, e);
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
public void add(E e) {
checkForComodification();
try {
int i = cursor;
ArrayList.this.add(i, e);
cursor = i + 1;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
}