Javaプログラミングをしていると、リストを使う場面で ArrayList
を使うか List
を使うかで迷うことがあります。この記事では、ArrayList<Integer> array = new ArrayList<Integer>();
と List<Integer> array = new ArrayList<Integer>();
の違いを整理していきます。
宣言の違い
ArrayList<Integer> array = new ArrayList<Integer>();
これは、ArrayList
型の変数 array
を宣言しています。具体的な ArrayList
クラスを直接使うので、ArrayList
固有のメソッドや機能にアクセスできます。
ArrayList<Integer> array = new ArrayList<Integer>();
array.ensureCapacity(100); // ArrayList 固有のメソッド
この例では、ArrayList
の ensureCapacity
メソッドを使っています。このメソッドは、ArrayList
特有のものです。
List<Integer> array = new ArrayList<Integer>();
こちらは、List
インターフェース型の変数 array
を宣言しています。ArrayList
を実装として使っていますが、コードの他の部分では List
インターフェースのメソッドしか使いません。
List<Integer> array = new ArrayList<Integer>();
// array.ensureCapacity(100); // List インターフェースにはこのメソッドがないため使用できません
// 他の List 実装に変更が容易
array = new LinkedList<Integer>();
この例では、後から LinkedList
に変更しても問題なく動作します。List
インターフェースを使うことで、具体的な実装に依存しない柔軟なコードが書けます。
インターフェースと実装の違い
List インターフェース
-
List
はリストの一般的な操作を定義するインターフェースです。 -
ArrayList
やLinkedList
など、複数の実装クラスがあります。 -
List
インターフェースを使うと、具体的な実装に依存しないコードが書けます。
ArrayList クラス
-
ArrayList
はList
インターフェースを実装した具体的なクラスです。 - 配列に基づいたリストの実装で、要素のランダムアクセスが高速です。
- 固有のメソッドや機能があり、直接使用する場合はそれらを利用できます。
使い分けのポイント
ArrayList<Integer> array = new ArrayList<Integer>();
を使う場合
- 具体的な
ArrayList
クラスの機能を使いたい場合。 - 実装が変更されないことが確実な場合。
List<Integer> array = new ArrayList<Integer>();
を使う場合
- インターフェース型を使うことで、後で
List
の他の実装に変更する可能性がある場合。 - より柔軟でメンテナンスしやすいコードを書きたい場合。
具体的な例
以下の例で、List
型を使うメリットを示します。
// インターフェース型の使用
List<Integer> array = new ArrayList<Integer>();
array.add(1);
array.add(2);
array.add(3);
// 実装を変更しても問題ない
array = new LinkedList<Integer>();
array.add(4);
array.add(5);
このように、インターフェース型を使うことで、後で実装を変更する際の影響を最小限に抑えることができます。
まとめ
-
ArrayList<Integer> array = new ArrayList<Integer>();
は具体的なArrayList
型を使い、ArrayList
固有のメソッドや機能にアクセスできます。 -
List<Integer> array = new ArrayList<Integer>();
はList
インターフェースを使い、コードの柔軟性とメンテナンス性を高めます。後で実装を変更する場合に便利です。