支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡


◇はじめに

本記事では、JavaのListとArrayListについて解説していきます。Javaの学習をしていると、ArrayListの宣言の際に【List<型> 変数名 = new ArrayList<型>();】としている事が多いことでしょう。それを見たとき私は、ArrayListを生成したいのになぜわざわざList型で宣言しているのだろう、と疑問に思いました。本記事は同じような疑問を持たれた方の参考になればと思います。

まずはじめに、ListとArrayListの違いについて解説していきます。

◇ListとArrayListの違いとは?

違いを結論から述べると、Listはインターフェースであり、ArrayListはListインターフェースを実装したクラスになります。
まずインターフェースとは、具体的な処理の内容の記述は無く、実装先のクラスで定義できるようにメソッドの型や変数を記述したものです。そのため、インターフェース自体のメソッドを用いて機能を呼び出すことはできません。それに対しArrayListはインターフェースであるListをもとに実装化したクラスであるため、機能を呼び出し使用する事ができます。

Listは配列のように「順序をつけて値を格納する」構造を特徴とした機能を提供するためのインターフェースです。

◇ArrayListの宣言方法

それでは、ArrayListクラスを使用したい場合はどのように宣言をおこなうかを見ていきましょう。

//ArrayList型で宣言する場合
ArrayList<型> 変数名 = new ArrayList<型>();

//List型で宣言する場合
List<型> 変数名 = new ArrayList<型>();

先述ではListインターフェースを直接用いて機能を利用することはできないと記述しましたが、宣言側の型としてListを使用する事は可能です。この場合のインスタンスは実際はArrayListでありながら表面的にはあくまでListとして捉えられるよう、多様性や拡張性を考慮して意図的に生成されたかたちとなります。
しかし、Listはあくまでインターフェースであり、実装されたクラスではないため、以下のような宣言はおこなう事ができません。

List<型> 変数名 = new List<型>();

◇List型での宣言とArrayList型での宣言の違いとは?

それではここからはArrayList型で宣言する場合とList型で宣言する場合の違いについてお話していきます。

多くの入門書やJavaに関する問題集にはList型で宣言するケースも良く見られ、なぜわざわざArrayList型としてではなくList型で宣言する事が多いのか、疑問を持たれた方も多いのではないかと思います。
これらの方法にはどのような違いがあるのでしょうか?

■List型で宣言する場合のメリット

おおまかにList型として捉えられることで、List型で宣言された他インスタンス(LinkedListなど)と型の違いを気にすることなくまとめて処理をおこなえたり、後で型変更をおこなってもコードの変更範囲が少ない点です。

LinkedListクラスはArrayListと持っている機能も似ていますが、要素を保管する内部の構造に違いがあるため、双方に得意不得意が生じます。簡単に説明するのであればArrayListはずらっと横に並んだ箱で値を保管しているため、その途中に箱を入れたり抜いたりするとそれ以降の箱を都度ずらさないといけないのでパフォーマンスが低くなります。対してLinkedListの箱はバラバラに設置されており、その代わりに各箱の繋がり情報(連結情報)で繋がっている形式のため、値の追加や削除に対して柔軟に対応できるパフォーマンスを持っています。しかしArrayListと違った不得意分野もあり、整列した箱を持つArrayListと比べ値の検索や取り出しの処理のパフォーマンスは劣ることが挙げられます。
このようにそれぞれの特徴を理解し、今後の用途を考慮した上でArrayListとLinkedListクラスを使い分けるわけですが、これらをList型で宣言する事いにより例えばList型を受け付ける拡張for文などでも型の差を気にする必要が無くなるなど、拡張性を高めることができます。

■List型で宣言する場合のデメリット

ListにないArrayList固有のメソッドを使用できない点です。

例えばclone()メソッドです。これはArrayListのインスタンスを複製(参照元コピー)してくれるメソッドで、Listにはない機能です。その他にもensureCapacity()、removeRange()、trimToSize()などのメソッドがArrayList固有のメソッドがありますが、List型で宣言されている場合はこれらの機能を使うことがでず、もし使用したい場合はArrayList型へのキャストをしなければなりません。

ArrayList型で宣言する場合のメリットやデメリットは先述のList型宣言と逆になります。メリットは固有のメソッドを使える点、デメリットはList型として捉えられてない事により拡張性や多能性が下がってしまう点です。

以上の事から、ArrayList固有のメソッドを使用するであろうと予想できる場合はArrayList型での宣言、それ以外はList型宣言で拡張性などのメリットを高めておくことが好ましいのではないでしょうか。

◇おわりに

いかがでしたでしょうか。
入門書などにはこのような違いが載っていない場合もあるため、今回の点は気になっていた方もいらっしゃったのではないでしょうか。この記事が疑問解決の助けになれば大変嬉しく思います。最後まで読んでいただきありがとうございました。