どう違うの?JavaにおけるListと配列の違いと使い分け方
Javaを学習していて、こう思ったことはありませんか?本記事では、このよく似た二つの違いと使い分け方を解説します。
Listと配列、それぞれに特徴があり、得意不得意があります。この記事で把握して、上手く使い分けられるようになりましょう!
こんなひとにお勧め
- Javaを学習し始めて、基本文法はひととおり学習したよ!というプログラミング初心者の方
- 普段なんとなくListや配列を使っているけれど、正直書き方以外の何が違うのか分からない・・・という方
- もっとListや配列の構造を理解して、効率よく使えるようになりたい!という方
以上のような方に使い方や構造のイメージを持って頂くことを目的としています。プログラミングを深い部分まで熟知している方には適しませんのでご注意ください。
目次
そもそもListって何?配列って何?
Listと配列の違い
結局どっちを使ったらいいの?
まとめ
そもそもListって何?配列って何?
List
ここではjava.util.List
インターフェースを実装したクラスを総じてListと呼ぶことにします。List
インターフェースはコレクションインターフェースの一種で、java.util.Collection
インターフェースのサブインターフェースです。コレクションについては、複数のオブジェクトをグループとして扱うものだと思ってください。
Listの場合、オブジェクトの管理にインデックス(要素番号)を用います。List生成時にデフォルトの要素数を指定する必要はありません。また、要素の追加や削除は自由に行えます。
配列
Listと同様に、インデックスを用いて複数のデータを管理します。配列を扱うときには、宣言時に要素数を決めておく必要があります。要素数をあとから増減させることはできません。
Listと配列の違い
データの持ち方
Listと配列では、データの保持の仕方が異なります。Listは新しい要素が追加されるたびにメモリの領域を確保しますが、配列ははじめにメモリ上の連続した領域を確保します。
Listの場合、各要素は自分の次に追加された要素にリンクします。要素へのアクセスは、リンクをたどって行われます。なお、リンクの仕方はクラスによって異なります。
配列はメモリ上のまとまった領域を分割し、それぞれにインデックスを振ります。要素のアクセスは、インデックスを指定することで直接行えます。
イメージとしては以下の図のようなものだと思ってください。
要素数の変動
Listでは要素数の増減やデータの挿入、入れ替えが容易です。リンクの追加や削除、リンク先の変更を行うだけで済むからです。
配列の場合、はじめに必要な領域を確保している為、一度作ってしまうと要素数の増減を行うことはできません。また、要素の入れ替えをするには、まず片方の要素を削除し、別の要素を移動させ、最初に削除した要素を空いた部屋に入れなおす必要があります。
使用できるメソッド
Listを扱う場合には、要素の追加や削除、呼び出しや要素数の取得などの操作を全てメソッドで行います。豊富なメソッドが用意されていますので、APIリファレンスで調べてみてください。
一方、Javaの仕様で配列にはメソッドが用意されていません。変わりに配列.length
として要素数を取得するなどの構文が用意されています。また、ひとつひとつの要素が変数と同様に扱われます。
要素の検索
Listでランダムな要素を検索する場合、端の要素からリンクをたどる必要がある為、少し時間が掛かります。
配列はインデックスを指定すれば直接要素を参照できる為、どの要素にも同じ時間でアクセスできます。
結局どっちを使ったらいいの?
どちらかのほうが優れている、ということはない
これまでに見てきたように、Listと配列にはそれぞれ一長一短があり、どちらの方がすぐれている、というようなものではありません。状況や目的に合わせて、適したほうを使うようにしましょう。
Listを使ったほうがいい場合
これまで見てきた特長から、頻繁に要素の入れ替えが起こったり、要素の追加や削除が行われたりする場合には、Listが適していると言えます。また、要素数が特定できないような時にもListを利用すると柔軟に対応できるかもしれません。
配列を使ったほうがいい場合
配列が適しているのは、最初の時点で要素数が確定している場合や、何度もランダムな要素にアクセスするような場合です。要素の入れ替えが多かったり、あとから追加する必要が出てくるような場合には避けたほうがいいでしょう。
まとめ
- Listと配列ではデータの保持の仕方が異なる。また言語として用意されている仕様も異なる。
- Listは要素の移動や追加・削除が柔軟に行えて、配列はどの要素にアクセスするときにも時間が変わらない
- Listは柔軟にデータを扱いたいとき、配列は扱うものが決まっているときに適している
それぞれの特長を理解して、一歩進んだプログラムを組みましょう!
*1: JavaにはList以外にも複数種類のコレクションインターフェースが用意されていますが、配列と最も似た形式で(インデックスを使って)要素の管理を行うのがListであるため、本記事ではListを扱うこととします。