1

虽然我对 Java 不是很陌生,但以下问题让我非常困惑,以至于我无法克服这个问题。我在网上搜索了很多,也找到了一些答案,但它们并不完全令人满意。任何人都可以解决我的疑问

我的困惑是:

 1) Vector v = new Vector();  
    v.addElement("A");  
    ........  
    ........  
    Iterator iter = v.iterator();  

Q1:迭代器是一个接口,我们不能实例化或创建一个接口的对象。那么我们应该在这里称之为“迭代器”,它是什么?

Q1.1:Iterator 的所有方法(例如 next())都被“ iter ”调用。这些方法在哪里定义?如果这些方法是在 Vector 类的特定内部类中定义的(正如我在网上找到的),那么 iterator() 方法返回什么?我们不能直接通过对象 'v' 调用这些方法吗?

Q1.2:根据Javadoc:Vector实现了{Cloneable、Collection、List、RandomAccess、Serializable}
这些都没有实现Iterator。那么Vector是如何实现Iterator的呢?

 2) In the declaration:  
    List list = new ArrayList();  

Q1:List 是一个接口,ArrayList 是一个类。所以 new ArrayList() 创建了一个 ArrayList 的实例。
这个实例如何应用于“列表”,它又是什么?

谢谢.....

4

2 回答 2

4

Re 1)Iterator确实通常被实现为相应集合类的私有内部类。这就是为什么你看不到实际的实现类,只有接口。这很好,因为它的实现细节不是客户关心的。您可以在例如调试器中检查它的真实类型,或者在Vector与您的 JDK 安装捆绑在一起的源代码中查找它。

Vector 不实现Iterator自身 - 它仅从其iterator方法返回上面提到的内部类的实例。这个内部类实例有一个对Vector创建它的实例的引用,并且可以看到它的内部结构,这就是它可以遍历它的元素的原因。这就是迭代器模式有用的原因:它允许您遍历许多不同的集合(或实际上是Iterables),而无需处理它们的实现细节。

Re 2)你list的正是它的样子:ArrayList类的一个实例。后者实现了List接口,因此 eachArrayList是一个List.

List list = new ArrayList();

是成语“接口程序,而不是实现程序”的一个例子。由于list上面声明的类型是List,您可以像使用其他任何类型一样使用它,List并且您的后续代码不依赖于它的实际实现。因此,如果后来发现ArrayList使用 aLinkedList或 a代替 a 会更好CopyOnWriteArrayList,您只需要更改上面的一行代码,其余代码仍然可以正常工作。而如果你声明list

ArrayList list = new ArrayList();

后来意识到它的类型应该改变,你至少需要使用所有的代码,list并在提到它的地方相应地改变它的类型。此外,某些代码甚至可能使用特定于 的方法ArrayList,这些方法在其他实现类中不可用或工作方式不同,从而使更改成本更高。

于 2012-04-19T09:49:47.330 回答
0

Q1)您可以创建一个实现接口的实例。iter是对必须实现的对象的引用Iterator

Q1.1) 它们被实现为嵌套类。您应该能够在源代码中看到它。

iterator() 返回对迭代器的引用。

对象v没有实现迭代器。

Q1.2)

这些都没有实现迭代器。

这就是为什么你不能调用迭代器的任何方法的原因。

那么Vector如何实现Iterator

它没有。AbstractList 有一个实现 Iterator 的嵌套类

Q1)再次?

list是对一个对象的引用,该对象必须实现 ArrayList 所做的 List(或 null)

顺便说一句:除非你必须,否则我不会使用 Vector,而且我会在示例中使用泛型(它们已经存在 8 年了;)

于 2012-04-19T10:00:11.310 回答