東大ニート

東大卒のニートが勉強したことをメモするブログ

<Java>Listインターフェースの使い方

プログラミングコンテストの問題を解いていたら、動的配列を使いたいなと思う時がありました。普通の配列では要素数を増やせないので、要素数を増やすことができるリストを使ってみました。

今回はListインターフェースの使い方とメソッド、実装クラスについてメモします。

以下の3サイトを参考にさせていただきました。

www.task-notes.com

itdata.blog.shinobi.jp

www.javadrive.jp

 

まずは配列とリストとの違い

配列とリストは、大きく以下の点が違います。

配列
  • 要素数を増やせない
  • プリミティブ型・参照型どちらも格納できる
リスト
  • 要素数を増やすことができる
  • 参照型しか格納できない

もちろん使用できるメソッドも異なるので、目的に応じてどちらを使用するか考えなければいけません。
※プリミティブ型・参照型については文字列の比較とプリミティブ型・参照型 に書いています。

 

続いてListとArrayListとの違い

何が違うかというとListは抽象メソッドを持っているインターフェース、ArrayListはインターフェースの抽象メソッドを実装した実装クラスとなります。

Listインターフェースの実装クラスにはArrayListクラスの他にもLinkedListクラスやVectorクラスがありますが、どれもListインターフェースのメソッドを使用できます。

メソッドと抽象メソッドって何が違うの?、抽象クラスとインターフェースとの違いは?といった疑問もあるので、また今度調べなきゃ…。

 

Listインターフェースの使い方

実装クラスとして、ArrayListクラスを使ってみます。
例えば以下のコードを実行すると

  1. import java.util.List;

  2. import java.util.ArrayList;

  3.  

  4. public class Main {

  5.        public static void main(String[] args) {

  6.               List<Integer> al = new ArrayList<Integer>();

  7.               al.add(1);

  8.               al.add(2);

  9.               al.add(3);

  10.               for (int i = 0; i < al.size(); i++) {

  11.                      System.out.println(al.get(i));

  12.               }

  13.        }

  14. }

以下の結果が出力されます。

1
2
3

 ポイント1. Listインターフェースのインポート(1・2行目)

まず、java.utilパッケージに含まれるListインターフェースをインポートします。「import java.util.List;」を記述します。

また、実装クラスを使用する場合は、「import java.util.ArrayList;」のようにクラスをインポートします。

ポイント2. ArrayListインスタンスの作成(6行目)

次にArrayListインスタンスの作成ですが、少し見慣れない書き方をします。
ListやArrayListのあとに「<>」を書き、中にリストに格納する型を記述します。

例えばInteger型を格納する「al」というArrayListインスタンスを作成する場合、
「List<Integer> al = new ArrayList<Integer>();」のように記述します。

String型を格納する場合は
「List<String> al = new ArrayList<String>();」となります。

リストに格納できるのは参照型のみとなるので、「int」や「double」は使えず、「Integer」「Double」となります。


このように、リストは(ArrayList以外のLinkedListなども含め)処理対象とする型があらかじめ特定されているのではなく、パラメータとして定義することができます。

このような機能をジェネリクスと言います。

 

各実装クラスの特徴

 ArrayList、LinkedList、Vectorそれぞれの特徴は以下のようになっています。

  • ArrayList

配列構造でデータを持ち、データの参照に強い。ただし、データの挿入と削除に弱い。

  • LinkedList

リスト構造でデータを持ち、データの参照には弱い。データの挿入と削除には強い。

  • Vector

ArrayListと同様の機能を持ち、同期をとることができる。ただし、その分、ArrayListより効率が劣る。

 

Listインターフェースのメソッド

 上記のコード例では「add」メソッド(7〜9行目)や「size」メソッド(10行目)、「get」メソッド(11行目)を使用しています。

メソッドのあとにindexを書くことがありますが「 [ 」ではなく「 ( 」で囲むのに注意しましょう。

代表的なメソッドは以下の通りです。
※記述例ではArrayListインスタンス「al」への処理を想定して記載しています。

  • add

リストの最後に要素を追加します。
要素「"test"」を追加する場合は「al.add("test");」と記述します。

  • set

リストの指定された要素の値を更新します。
3番目の要素を「"Tokyo"」に更新する場合は「al.set(2, "Tokyo");」と記述します。

  • remove

リスト内の指定された要素を削除します。
4番目の要素を削除する場合は「al.remove(3);」と記述します。

  • clear

リスト内のすべての要素を削除します。
al.clear();」と記述します。

  • get

リストの指定された要素を返します。
2番目の要素を知りたい場合は「al.get(1);」と記述します。

  • indexOf

リストから要素を先頭から検索し、最初に見つかった要素のindexを返します。
要素「"Japan"」のindexを検索したい時は「al.indexOf("Japan");」と記述します。

  • lastIndexOf

indexOfと似ていますが、要素を最後から検索し、最初に見つかった要素のindexを返します。
要素「"Korea"」のindexを後ろから検索したい時は「al.lastIndexOf("Korea");」と記述します。

  • size

現在格納されている要素数を返します。
al.size();」と記述します。

 

だいたいこんな感じでしょうか。次はArraysクラスも勉強してみたいな…。