List<Integer> mylist = new ArrayList<Integer>();
ArrayList<Integer> mylist2 = new ArrayList<Integer>();
JavaコレクションAPIの上記2つの実際の違いは何でしょうか。私はJavaコレクションAPIを初めて使用します。ListはArrayListクラスが実装するインターフェースであることを私は知っています。
List<Integer> mylist = new ArrayList<Integer>();
ArrayList<Integer> mylist2 = new ArrayList<Integer>();
JavaコレクションAPIの上記2つの実際の違いは何でしょうか。私はJavaコレクションAPIを初めて使用します。ListはArrayListクラスが実装するインターフェースであることを私は知っています。
List<Integer>
バージョンはインターフェイスタイプです。インターフェイスによって宣言されたメソッドのみを実行できますが、型付きArrayList<Interger>
変数を使用すると、ArrayList<Interger>
およびそのスーパーで宣言されたすべてのことを実行できます。(List
もちろん含む)。
ただし、最初に選択するのは「役に立たない」ように見えますが(実際には柔軟性が高くなります)、後で動的タイプとしてではLinkedList<Interger>
なく(たとえば)が必要であると判断した場合に、デザインをはるかに簡単に変更できます。ArrayList<Interger>
追加:
もちろん、バージョンを自動的に選択する必要があるという意味ではありません。List<Integer>
実際に正確なタイプを使用する必要がある場合は、ArrayList
それを選択する必要があります。経験則としては、インターフェイスバージョンから始めてArrayList<Integer>
、タイプを使用して非常に簡単に実行できることを取得するのに苦労している場合にのみ(または...ArrayList
にキャストしている場合)に変更することをお勧めします。ArrayList
ステートメント1では、まだ参照しているmylist
ため、インターフェースでのみ使用可能なメソッドを使用できます。cross class.method機能を使用している場合、これはより適切なステートメントです。List<Integer>
ArrayList<Integer>
List
また、受け入れるメソッドは、 egの実装クラスまたはカスタム実装クラスList<Integer>
のいずれかを受け入れることができます。List
LinkedList<Integer>
2番目のステートメントは、オブジェクトをArrayList<Integer>
ONLYとして作成および参照します。一部の人々mylist
は、メソッドでローカルに使用される場合にそれを好む。
常にインターフェイスにコーディングします。
(車アナロジーアラート)
ハーツレンタカーに乗り込みます。あなたは、私が欲しいと言いますIVehicle
。彼らは、「まあ、どんなものですIVehicle
か?」と言います。あなたは気にしません。だから彼らはあなたにDumpTruck
. しかし、ダンプトラックは必要ありません。コンパクトなものが必要です。ICompact
拡張する が必要ですIVehicle
。それで彼らはあなたにバイクをくれます。"いいえ!" あなたは「欲しいICar
!」と叫びます。「何のICar
?」彼らが聞く。"私は気にしない!" あなたは叫ぶ。だから彼らはあなたに を与え、あなたはFordCar
その後ずっと幸せに暮らしています.
それはそれをクリアしますか?
あなたはそれをポリモーフィズムと考えることができます。
List<Integer> mylist
それをリストとして宣言しますが、ArrayListである必要はありません-JVMは、リストインターフェイスを実装していることを知っているだけです。
ArrayList<Integer> mylist2
これはArrayListであると宣言しているため、JVMは、それがListであるだけでなく、特にArrayListであることを認識しています。
最初のものは、インターフェースへのコーディングと呼ばれます。
コード全体で参照を使用すると、クライアント コードを壊すことなくList
具体的な実装を のような別のものに更新できます。LinkedList
ListはArrayListクラスが実装するインターフェースであることを私は知っています。
それがまさに違いです:)
コードで2つの変数(mylist)と(mylist2)を使用している場合、mylist2でのみ基本的なListインターフェイスの一部ではないArrayListで定義されているメソッドにアクセスできます。
の場合、インターフェイスmyList
のメソッドのみを呼び出すことができます。List
たとえば、ensureCapacity
myListのメソッドを呼び出すことはできません。