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インターフェースを使い、コードの柔軟性とメンテナンス性を高めます。後で実装を変更する場合に便利です。