1

私はJavaにあまり慣れていませんが、次の質問は私を混乱させ、これを克服することはできません。私はウェブでたくさん検索し、いくつかの答えも見つけましたが、それらは完全に満足のいくものではありませんでした。誰かが私の疑問を解決してくれませんか

私の混乱は次のとおりです。

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

Q1:イテレーターはインターフェースであり、インターフェースへのオブジェクトをインスタンス化または作成することはできません。それでは、ここで「イテレーター」とは何と呼ぶべきで、それは何ですか?

Q1.1:Iteratorのすべてのメソッド(例:next() )は「 iter 」によって呼び出されます。これらのメソッドはどこで定義されていますか?これらのメソッドがVectorクラスの特定の内部クラスで定義されている場合(Webで見つけたように)、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それを作成したインスタンスへの参照があり、その内部を確認します。そのため、要素を反復処理できます。IterableこれがIteratorパターンが役立つ理由です。これにより、実装の詳細を処理することなく、多くの異なるコレクション(または実際にはs)を反復処理できます。

Re 2)あなたlistはまさにそれがどのように見えるかです:ArrayListクラスのインスタンス。後者はListインターフェースを実装しているため、すべてArrayListListです。

List list = new ArrayList();

は、「実装用ではなく、インターフェース用のプログラム」というイディオムの例です。list上記の宣言されたタイプはであるため、List他のタイプと同じように使用できList、後続のコードは実際の実装に依存しません。ArrayListしたがって、後で、の代わりに、たとえばaLinkedListまたはaを使用する方がよいことが判明した場合CopyOnWriteArrayListは、上記の1行のコードを変更するだけで、残りのコードは引き続き完全に機能します。一方、あなたlist

ArrayList list = new ArrayList();

そして後でそのタイプを変更する必要があることに気づきました。少なくとも、使用しているすべてのコードをlist調べて、言及されている場所に応じてタイプを変更する必要があります。さらに、一部のコードでは、に固有のメソッドを使用する場合もあります。これらのメソッドArrayListは、他の実装クラスでは使用できないか、動作が異なるため、変更にさらにコストがかかります。

于 2012-04-19T09:49:47.330 に答える
0

Q1)インターフェイスを実装するインスタンスを作成できます。iter実装する必要のあるオブジェクトへの参照ですIterator

Q1.1)ネストされたクラスとして実装されています。ソースでそれを見ることができるはずです。

iterator()は、イテレータへの参照を返します。

オブジェクトvはIteratorを実装していません。

Q1.2)

これらはいずれもIteratorを実装していません。

これが、イテレータのメソッドを呼び出すことができない理由です。

では、VectorはどのようにIteratorを実装するのでしょうか

そうではありません。AbstractListには、Iteratorを実装するネストクラスがあります

Q1)また?

listArrayListが実行するListを実装する必要があるオブジェクトへの参照です(またはnull)

ところで:必要がない限り、Vectorは使用しません。また、例ではジェネリックを使用します(8年前から存在しています;)

于 2012-04-19T10:00:11.310 に答える