在Java的Collection Framework中实现接口方法的地方?

时间:2012-04-19 09:47:34

标签: java collections interface

虽然我不是Java的新手,但是下面的问题让我很困惑,以至于我无法克服这个问题。 我在网上搜索了很多,也找到了一些答案,但它们并不完全令人满意。有人可以清除我的怀疑

我的困惑是:

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

Q1: Iterator 是一个界面,我们无法实例化或创建对象的对象。那么我们应该将“ iter ”称为“ iter ”这是什么呢?

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

Q1.2:根据Javadoc:Vector实现{Cloneable,Collection,List,RandomAccess,Serializable}
这些都没有实现Iterator.So如何实现Iterator?

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

Q1:List是一个接口,ArrayList是一个类。所以新的ArrayList()创建了一个ArrayList实例 如何将此实例应用于“列表”并再次应用于什么?

感谢.....

2 个答案:

答案 0 :(得分:4)

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

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

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

List list = new ArrayList();

是成语“接口程序,而不是实现”的示例。由于上面声明的list类型为List,因此您可以像使用其他任何List一样使用它,后续代码不依赖于其实际实现。因此,如果后来证明代替ArrayList,则最好使用例如LinkedList。一个CopyOnWriteArrayListlist,您只需要更改上面的一行代码,其余代码仍然可以完美运行。而如果您将ArrayList list = new ArrayList(); 声明为

list

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

答案 1 :(得分:0)

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

的对象的引用

Q1.1)它们是作为嵌套类实现的。你应该能够在源头看到它。

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

对象v未实现Iterator。

Q1.2)

  

这些都没有实现Iterator。

这就是为什么你不能调用Iterator的任何方法。

  

那么Vector如何实现Iterator

它没有。 AbstractList有一个实现Iterator

的嵌套类

Q1)再次?

list是对一个对象的引用,该对象必须实现List,ArrayList才能执行(或为null)

顺便说一下:我不会使用Vector,除非你必须这样做,我会在例子中使用泛型(它们已经存在了8年了;)