4. コレクション
4.1. コレクション(Listについて)
リストとは、順序付けられたコレクションです。整数値の添え字によって要素にアクセスしたり、リスト内の要素を取得したりすることができます。リストは重複する要素を許可し、また複数のnull
要素の挿入も許可します。主に以下の特徴があります。
1)コレクション内のオブジェクトの順番を管理することができる。
2)同じオブジェクトへの参照を複数保持することができる。
3)null
を複数保持することができる。
4.1.1 ArrayList
List
インターフェースを実装する代表的なクラスが、java.util.ArrayList
クラスです。サイズが拡張可能な配列型データ構造を持ちます。配列と同じように添え字を使ってオブジェクトへの参照の出し入れを行うことができます。
ArrayList
クラスの主なメソッド
メソッド | 意味 |
boolean add (Object o) |
リストの最後に、指定されたオブジェクトを追加する |
Void add(int index, Object o) |
リストの指定された位置に、指定されたオブジェクトを追加する |
object get(int index) |
指定された位置にあるリスト内のオブジェクトを取得 |
int size() |
リストにある要素数を取得する |
object remove(int index) |
リスト内の指定されたオブジェクトを削除する |
サンプル
import java.util.ArrayList; public class Exm_ArrayList { public static void main(String args[]) { //ArrayListクラスのオブジェクトを生成 ArrayList cars = new ArrayList(); //Stringクラスである文字列をArrayListクラスに追加 cars.add("フェラーリ"); //0番目の要素に追加 cars.add("ポルシェ"); //1番目の要素に追加 cars.add("メルセデスベンツ"); //2番目の要素に追加 //ArrayListに入っている要素数だけ繰り返す for(int i = 0; i < cars.size(); i++){ String str = (String)cars.get(i); //ArrayListの要素をString型にキャストして取得 System.out.println(str); //変数strの値を画面上に表示 } } }
今回はArrayList
のオブジェクトcars
にString型の文字列を設定しました。
ここで注意する点は、設定したデータを取り出すには設定した同じ型を使用しキャスト変換を行い取得することです。もし、設定したオブジェクトのクラスや、スパークラス以外でキャスト変換を行うとClassCastException
が発生する可能性があります。
実際に上記のExm_ArrayList
クラスを実行してみると以下のような実行結果となります。
フェラーリ ポルシェ メルセデスベンツ
次に、上記で使用したExm_ArrayList
クラスに手を加えてみます。
cars.remove(1); // 1番目の要素を削除 cars.add(1, "BMW"); // 1番目の要素に追加 cars.add("フォルクスワーゲン"); // 3番目の要素に追加 //ArrayListに入っている要素数だけ繰り返す for(int i = 0; i < cars.size(); i++){ String str = (String)cars.get(i); //ArrayListの要素をString型にキャストして取得 System.out.println(str); //変数strの値を画面上に表示 } } }
上記のように手を加えると実行結果は以下のようになります。
フェラーリ BMW メルセデスベンツ フォルクスワーゲン
List
と同じように順番を管理するものとして、配列が存在しますが、大きな違いが存在します。
以下の表はList
と配列との違いをまとめたものです。
List配列可変である (追加・削除により変化する)不変である (最初に定義したまま変わらない)決まったデータ型のみ (最初に定義したまま変わらない)java.lang.Object
型であれば何でも可 (取り出す時にキャストが必要)不可能可能
要素数 | ||
格納出来る値 | ||
基本データ型の格納 ※1 |
※基本データ型:int, long, boolean等
配列は要素数が固定となりますが、使用メモリが少ないという特徴があります。また、Collection
インターフェースを持つクラスは配列よりも使用メモリが多くなりますが、要素を自由に追加・削除できるという特徴があります。プログラムを記述する際は、それぞれの特徴を考えてどちらを使用すべきかを考えてコーディングする必要があります。
問題 3-4-1
果物の名称を持つ配列、List
を使い、二通りの方法で作成してみよう。
4.2. コレクション(Mapについて)
Map
インターフェースは「キー」と「値」の対(つい)になる要素を持ったオブジェクトです。マップには同一のキーを複数登録することはできません。しかし、異なるキーで中身の値が同じデータは登録することができます。キーから値を参照するような処理に適しています。主に以下の特徴があります
・ コレクション内のオブジェクトに名前(キー)をつけて管理することができる。
・ 同じオブジェクトへの参照を複数保持することができる。
・ 同一キーを複数登録することはできない。
4.2.1. HashMap
Map
インターフェースを実装する代表的なクラスが、java.util.HashMap
クラスです。Map
は要素を「キー(オブジェクトにつけた名前)」を使って管理する点です。また、HashMap
はキーの並び順を保持しないという特性を持っています。順番を管理しないので、オブジェクトを追加した順番で取り出すということはできません。(Hashtable
クラスもHashMap
クラスと同じように使えます。)
HashMap
の主なメソッド
メソッド | 意味 |
Object put(Object key, Object value) |
第一引数のオブジェクトをキーとし、第二引数のオブジェクトを追加する |
Object get(Object key) |
引数のキーを持つオブジェクトを取得する |
Object remove(Object key) |
引数のキーを持つオブジェクトを削除する |
void clear() |
Mapから全ての要素を削除する |
Int size() |
要素数を取得する |
サンプル
import java.util.HashMap; public class Exm_HashMap { public static void main(String[] args) { //HashMapオブジェクト生成 HashMap map = new HashMap(); //Mapにオブジェクトを追加 map.put("H","水素"); map.put("O","酸素"); map.put("C","炭素"); //キーから値を取得して表示 System.out.println(map.get("H")); System.out.println(map.get("C")); } }
上記のコードは、HashMap
オブジェクトの「キー」値に「元素記号」を指定して、キーに対応する値に「元素名」を入れています。まず、8行目でHashMap
クラスからHashMap
オブジェクトを生成し、11行目〜13行目で生成したHashMap
オブジェクトに「キー」と「値」を追加しています。16・17行目ではget
メソッドを使い、「キー」値から関連付けられた値を取得して表示させています。
このようにMap
データ構造では、キー値を使って値を参照したい場合に有効です。
実際に上記のExm_HashMap
クラスを実行すると以下のような実行結果となります。
水素 炭素
Map
には同一のキーを複数登録することはできませんと説明しました。では、重複したキー値を追加した場合はどうなるのでしょうか?先ほどの例「Exm_HashMap.java
」に「重複するキー」を追加するコードを記述してみました。
サンプル
import java.util.HashMap; public class Exm_HashMap { public static void main(String[] args) { //HashMapオブジェクト生成 HashMap map = new HashMap(); //Mapにオブジェクトを追加 map.put("H","水素"); map.put("O","酸素"); map.put("C","炭素"); //重複するキーで追加 map.put("H","スイソ"); map.put("C","タンソ"); //キーから値を取得して表示 System.out.println(map.get("H")); System.out.println(map.get("O")); System.out.println(map.get("C")); } }
これを実行すると以下のような実行結果となります。
スイソ 酸素 タンソ
上記のように、キー値を重複して追加した場合、キー値に関連付けられた値が上書きされます。上書きされる前のデータ(この場合は「水素」と「炭素」)はHashMap
オブジェクトから削除されますので、プログラマはこれらのことを頭に置いてプログラムを組んでいく必要があります。
問題 3-4-2
Map
の性能を把握しながら果物の名前をキーに果物の色を保持するMap
を作成し、使用してみよう。