Javaのリスト(List)と配列は似た性質を持つが使い方や有用性が異なる。
このページではJavaのListと配列の違い、加えてListの使い方についてお伝えした。参考にしていただければと思う。
目次
リスト(List)とは
Javaのリスト(List)とは、重複した要素を含むことができる順序の付けられたコレクションだ。
追加や削除が行われてもデータがきちんと整理されて、順番に並べられるという意味になる。
このため、ユーザーはインデックスによって要素を挿入したり要素にアクセスしたりする位置を自由に変更することができる。
また、リストはセット(Set)とは違い、重複する要素を持つことを許し、複数のnull要素を持つこともできる。
リスト(List)インターフェース
Javaでは、リストを扱うためにリストインターフェースが定義されている。この後、リストインターフェースをListと呼ぶことにする。このListは、Collection(コレクション)をルーツとしてそこから枝分かれしたインターフェースである。
Listと配列の違い
Listは、持っている特長が配列に非常によく似ている。しかし、違いもあるので実際のコードからひとつひとつ確かめてみよう。
生成
最初に、両方とも要素を入れるための入れ物を生成する。このときどちらも入れ物の中にどんな型の要素を入れるかを定義する。
この点は同じだが、配列だけは入れ物の大きさを決めなければならない。一度配列の大きさを決めると、それ以後変更できない。コードはこうなる。
String[] list = new String[3];//[1]
一方、Listは要素の大きさは可変である。
List<String> list = new ArrayList<String>();
追加・削除・検索
配列は固定の大きさなので、追加・削除・検索はできない。しかし、Listは可変であるので、要素をどんどん追加できるし、削除もできる。
Listの要素である文字列「ABC」を追加して、検索し削除するコードはこうなる。
1 2 3 |
list.add("ABC"); int index = list.indexOf("ABC"); list.remove(index); |
取得・置換
配列もListもインデックスを指定して、要素を取得し置換することができる。indexが指す要素を取得しまた置換する配列のコードはこうなる。
1 2 |
value = list[index]; list[index] = "DEF"; |
同じ置換のListのコードはこうなる。
1 2 |
value = list.get(index); list.set(index, "DEF"); |
では、このListで定義されたメソッドを見てみよう。
Listのメソッド
ここでは、Listを実際に実装したArrayListクラスのメソッド仕様について紹介する。
追加
追加するために、ふたつのメソッドが用意されている。ひとつは、リストの最後に要素を追加するためのメソッドとリストの途中に要素を追加するためのメソッドだ。
add(E e)
戻り値の型 |
public boolean |
内容 |
特定の要素をリストの最後に追加する。
引数:e – リストに追加されるべき要素 戻り値:true |
add(int index, E element)
戻り値の型 |
public boolean |
内容 |
リストの指定された位置に指定された要素を挿入する。挿入された位置にあった要素(もしあれば)、また、後に続く要素は右にシフトする。(それらのindexに1を加える。)
引数: index - 指定された要素が挿入されるべきindex。 element – リストに挿入されるべき要素 戻り値:true 例外:IndexOutOfBoundsException – もしindexが範囲外ならば (index < 0 || index > size()) |
取得
要素を取得するためのメソッドはひとつしかない。indexを指定して、要素を取得する。もしindexが範囲外なら,例外を発生させて教えてくれる。
get(int index)
戻り値の型 |
public E |
内容 |
指定された位置にある要素を戻す。
引数:index - 戻すべき要素のインデックス 戻り値:リストの指定された位置の要素 例外:IndexOutOfBoundsException – もしindexが範囲外ならば (index < 0 || index > size()) |
置換
すでに存在する要素を、indexを指定して置き換える。もしindexが範囲外なら、例外を発生させて教えてくれる。
set(int index, E element)
戻り値の型 |
public E |
内容 |
指定された要素で,リストの指定された位置にある要素を置き換える。
引数: index - 置き換えるべき要素のインデックス element - 指定された位置に格納される要素 戻り値:指定された位置の置き換え前の要素 例外:IndexOutOfBoundsException – もしindexが範囲外ならば (index < 0 || index > size()) |
削除
削除するためのメソッドはいくつかあるが、その基本となるメソッドだ。戻り値に削除された要素が返されるので、確実に削除されたかどうかがわかる。
remove(int index)
戻り値の型 |
public E |
内容 |
指定された位置にある要素をリストから削除する。後に続く要素を左にシフトする(それらのインデックスから一つを取り去る)。
引数:e - 削除すべき要素のインデックス 戻り値:リストから削除された要素 例外:IndexOutOfBoundsException – もしindexが範囲外ならば (index < 0 || index > size()) |
検索
検索するためのメソッドはふたつある。最初の要素から探すか、最後から探すかによってメソッドを使い分けられる。戻り値に見つかった要素のインデックスが返される。
indexOf(Object o)
戻り値の型 |
public int |
内容 |
このリストの中で指定された要素が最初に見つかったインデックスを戻す。または,もし要素が含まれていなければ-1を戻す。 もっと形式的にいうならば,(o==null ? get(i)==null : o.equals(get(i)))の内最も小さいインデックスを戻す。もし,そのようなインデックスがなければ-1を戻す。
引数:o – 検索すべき要素 戻り値:リストの中で指定された要素の最初に見つかったインデックス。もし要素がリストに含まれていなければ-1。 |
lastIndexOf (Object o)
戻り値の型 |
public int |
内容 |
このリストの中で指定された要素が最後に見つかったインデックスを戻す。または,もし要素が含まれていなければ-1を戻す。 もっと形式的にいうならば,(o==null ? get(i)==null : o.equals(get(i)))の内最も大きいインデックスを戻す。もし,そのようなインデックスがなければ-1を戻す。
引数:o – 検索すべき要素 戻り値:リストの中で指定された要素の最後に見つかったインデックス。もし要素がリストに含まれていなければ-1。 |
それでは実際にサンプルプログラムで確認してみよう。
追加,取得と置換を使ったサンプルプログラム
このプログラムは、くだものの名前を最初にふたつ追加した後、追加した要素の「りんご」と「みかん」の間に「もも」を挿入するというものだ。さらに、最初の要素を「ぶどう」に置換している。
Listを実装したListArrayクラスを使って書くとこうなる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import java.util.List; import java.util.ArrayList; public class ListAdditionAndGet { public static void main(String[] args) { List<String> list = new ArrayList<String>();//[1] list.add("りんご");//[2] list.add("みかん");//[3] list.add(1, "もも");//[4] list.set(0, "ぶどう");//[5] System.out.println("[6] 要素[0]:" + list.get(0)); System.out.println("[7] 要素[1]:" + list.get(1)); System.out.println("[8] 要素[2]:" + list.get(2)); } } |
同じことを可能な限り配列で書くとこうなる。
1 2 3 4 5 6 7 8 9 10 11 |
public class ArrayAdditionAndGet { public static void main(String[] args) { String[] list = new String[3];//[1] list[0] = "ぶどう";//[2] list[1] = "もも";//[3] list[2] = "みかん";//[4] System.out.println("[6] 要素[0]:" + list[0]); System.out.println("[7] 要素[1]:" + list[1]); System.out.println("[8] 要素[2]:" + list[2]); } } |
実行結果
1 2 3 |
[6] 要素[0]:ぶどう [7] 要素[1]:もも [8] 要素[2]:みかん |
サンプルプログラムの説明
それでは簡単にListArrayを使ったプログラムの解説をしてゆこう。
- [1] ArrayListクラスのオブジェクト,listを生成する。
- [2] listに文字列:「りんご」を追加する。
- [3] listに文字列:「みかん」を追加する。
- [4] listのindex:1に文字列:「もも」を追加する。
- [5] listのindex:0を文字列:「ぶどう」に置換する。
- [6] listのindex:0から取得した要素を表示する。
- [7] listのindex:1から取得した要素を表示する。
- [8] listのindex:2から取得した要素を表示する。
検索,削除と例外を使ったサンプルプログラム
このプログラムは、果物の名前を最初に3つ追加した後、最後に追加した「みかん」を検索し、そのインデックスで「みかん」を削除する。
削除した要素を取得して、例外が発生することも確認している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import java.util.List; import java.util.ArrayList; public class ListIndexOfAndRemove { public static void main(String[] args) { List<String> list = new ArrayList<String>();//[1] list.add("りんご");//[2] list.add("もも");//[3] list.add("みかん");//[4] int index = list.indexOf("みかん");//[5] System.out.println("[6] index = " + index); list.remove(index);//[7] System.out.println("[8] 要素[0]:" + list.get(0)); System.out.println("[9] 要素[1]:" + list.get(1)); try {//[10] System.out.println("[11] 要素[2]:" + list.get(2)); } catch (IndexOutOfBoundsException indexOutOfBoundsException ) {//[12] System.out.println("[13] 要素[2]:例外発生"); } } } |
実行結果
1 2 3 4 |
[6] index = 2 [8] 要素[0]:りんご [9] 要素[1]:もも [13] 要素[2]:例外発生 |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1]-[4] 前のサンプルに同じ。
- [5] listの中の「みかん」を検索し,そのインデックスをindexに代入する。
- [6] indexを表示する。
- [7] listのindexにある要素を削除する。
- [8] listのindex:0から取得した要素を表示する。
- [9] listのindex:1から取得した要素を表示する。
- [10] 例外処理の開始tryを宣言する。
- [11] listのindex:2から取得した要素を表示する。
- [12] 例外処理のcatchを宣言する。
- [13] 例外が発生したことを表示する。
まとめ
このページではJavaのListと配列の違いについて、またListの使い方についてまとめてきた。
サンプルコードを含めて参考にしていただければ幸いだ。
コメント