10
List<Integer> mylist = new ArrayList<Integer>();

ArrayList<Integer> mylist2 = new ArrayList<Integer>();

JavaコレクションAPIの上記2つの実際の違いは何でしょうか。私はJavaコレクションAPIを初めて使用します。ListはArrayListクラスが実装するインターフェースであることを私は知っています。

4

7 に答える 7

8

List<Integer>バージョンはインターフェイスタイプです。インターフェイスによって宣言されたメソッドのみを実行できますが、型付きArrayList<Interger>変数を使用すると、ArrayList<Interger>およびそのスーパーで宣言されたすべてのことを実行できます。(Listもちろん含む)。

ただし、最初に選択するのは「役に立たない」ように見えますが(実際には柔軟性が高くなります)、後で動的タイプとしてではLinkedList<Interger>なく(たとえば)が必要であると判断した場合に、デザインをはるかに簡単に変更できます。ArrayList<Interger>


追加:
もちろん、バージョンを自動的に選択する必要があるという意味ではありません。List<Integer>実際に正確なタイプを使用する必要がある場合は、ArrayListそれを選択する必要があります。経験則としては、インターフェイスバージョンから始めてArrayList<Integer>、タイプを使用して非常に簡単に実行できることを取得するのに苦労している場合にのみ(または...ArrayListにキャストしている場合)に変更することをお勧めします。ArrayList

于 2012-12-04T18:50:52.493 に答える
2

ステートメント1では、まだ参照しているmylistため、インターフェースでのみ使用可能なメソッドを使用できます。cross class.method機能を使用している場合、これはより適切なステートメントです。List<Integer>ArrayList<Integer>List

また、受け入れるメソッドは、 egの実装クラスまたはカスタム実装クラスList<Integer>のいずれかを受け入れることができます。ListLinkedList<Integer>

2番目のステートメントは、オブジェクトをArrayList<Integer>ONLYとして作成および参照します。一部の人々mylistは、メソッドでローカルに使用される場合にそれを好む。

于 2012-12-04T18:51:03.147 に答える
2

常にインターフェイスにコーディングします。

(車アナロジーアラート)

ハーツレンタカーに乗り込みます。あなたは、私が欲しいと言いますIVehicle。彼らは、「まあ、どんなものですIVehicleか?」と言います。あなたは気にしません。だから彼らはあなたにDumpTruck. しかし、ダンプトラックは必要ありません。コンパクトなものが必要です。ICompact拡張する が必要ですIVehicle。それで彼らはあなたにバイクをくれます。"いいえ!" あなたは「欲しいICar!」と叫びます。「何のICar?」彼らが聞く。"私は気にしない!" あなたは叫ぶ。だから彼らはあなたに を与え、あなたはFordCarその後ずっと幸せに暮らしています.

それはそれをクリアしますか?

于 2012-12-04T19:07:29.907 に答える
1

あなたはそれをポリモーフィズムと考えることができます。

List<Integer> mylistそれをリストとして宣言しますが、ArrayListである必要はありません-JVMは、リストインターフェイスを実装していることを知っているだけです。

ArrayList<Integer> mylist2これはArrayListであると宣言しているため、JVMは、それがListであるだけでなく、特にArrayListであることを認識しています。

于 2012-12-04T18:51:28.793 に答える
1

最初のものは、インターフェースへのコーディングと呼ばれます。

コード全体で参照を使用すると、クライアント コードを壊すことなくList具体的​​な実装を のような別のものに更新できます。LinkedList

于 2012-12-04T18:50:06.263 に答える
0

ListはArrayListクラスが実装するインターフェースであることを私は知っています。

それがまさに違いです:)

コードで2つの変数(mylist)と(mylist2)を使用している場合、mylist2でのみ基本的なListインターフェイスの一部ではないArrayListで定義されているメソッドにアクセスできます。

于 2012-12-04T18:51:11.153 に答える
0

の場合、インターフェイスmyListのメソッドのみを呼び出すことができます。List

たとえば、ensureCapacitymyListのメソッドを呼び出すことはできません。

于 2012-12-04T18:51:22.617 に答える