Javaのコレクションについて

Javaの主なコレクション、List, Set, Mapについて内容と使い方を簡単に説明します。

コレクションとは

Javaではコレクションをオブジェクトのグループを表すオブジェクトとしています。

要するに複数のデータを集めてまとめて管理(操作)する手法です。

複数のデータというと配列を思い浮かべますが、Javaで配列を処理するには細かな考慮(たとえば、サイズを決めて配列を作るが後で変更するなど)が必要です。

そのような処理をより効率よく機能的にパフォーマンスが高く実現できるのがコレクションです。

ここではよく見る主なコレクションの「List」「Set」「Map」について説明します。

そして、「List」「Set」「Map」はインターフェイスです。

なのでこれらのインスタンスは直接生成することはできず、これらを実装したクラスがいくつか用意されているのでそれらを合わせて説明します。

Listについて

Listは順序付けされた要素が重複できるコレクションです。

ListはインターフェイスなのでListを実装したクラスのインスタンスを生成して利用します。

以下は主なクラスです。

ArrayList要素が順序をもった配列として実装されています。要素は指定した位置または最後の位置に挿入可能です。位置を指定して要素を取り出すことができます。順序番号を持っているので要素の取り出しは高速です。要素数が多くなると追加や削除に時間がかかります。
LinkedList基本操作はArrayListと同じです。ArrayListと違い要素同士が繋がった情報を持つ構造になっています。要素番号を持っていないので要素を取り出すには時間がかかります。ですが、要素の追加や削除は再配置を行わないので高速です。

使い方

インスタンスを生成して利用するので以下の書式となります。

ArrayList<要素の型> 変数 = new ArrayList<要素の型>();

Listを型宣言して利用することもできます。

List<要素の型> 変数 = new ArrayList<要素の型>();

この場合ArrayList型との違いは、基本操作はListの機能を使うので同じですが、ArrayListが持っている機能が使えません。

一方、List型の場合だとインスタンスを生成した後でもそのデータを使って違う型のインスタンスを生成できます。

これらは目的に応じて使い分けるといいでしょう。

主なメソッド

booleanadd(E e)このリストの最後に、指定された要素を追加します。
voidadd(int index, E element)このリスト内の指定された位置に指定された要素を挿入します。
voidclear()このリストからすべての要素を削除します。
Objectclone()インスタンスのシャロー・コピーを返します。
booleancontains(Object o)指定の要素がこのリストに含まれている場合にtrueを返します。
Eget(int index)このリスト内の指定された位置にある要素を返します。
intindexOf(Object o)指定された要素がこのリスト内で最初に検出された位置のインデックスを返します。指定された要素がこのリストにない場合は -1を返します。
Eremove(int index)このリストの指定された位置にある要素を削除します。
booleanremove(Object o)指定された要素がこのリストにあれば、その最初のものをリストから削除します。
Eset(int index, E element)このリストの指定された位置にある要素を、指定された要素で置き換えます。
intsize()このリスト内にある要素の数を返します。

*Eは要素の型に依存しています。

上記のメソッドは主なものでArrayListとLinkedListに共通したものです。

他にもそれぞれのクラスで便利なメソッドが用意されているので公式サイトを参照してください。

サンプルコード

    ArrayList<String> arraylist = new ArrayList<String>();
    LinkedList<String> linkedlist = new LinkedList<String>();
    arraylist.add("桜");
    arraylist.add("ひまわり");
    arraylist.add("紅葉");
    System.out.println("ArrayList: "+arraylist.toString());
    linkedlist.add("梅");
    linkedlist.add("コスモス");
    linkedlist.add("銀杏");
    System.out.println("LinkedList: "+linkedlist.toString());

【表示結果】

ArrayList: [桜, ひまわり, 紅葉]
LinkedList: [梅, コスモス, 銀杏] 

Setについて

Setは要素が重複しないコレクションです。

SetはインターフェイスなのでSetを実装したクラスのインスタンスを生成して利用します。

以下は主なクラスです。

HashSetこのクラスは、その順序を一定に保つことを保証しません。null要素を許容します。
LinkedHashSetこのクラスは、すべてのエントリをまたがる二重のリンク・リストを保持するという点で、HashSetとは異なります。反復順序を定義し順序は、要素がセットに挿入された順序となります(挿入順)。null要素を許容します。
TreeSet要素の順序付けは、自然順序付けを使って行われるか、Set構築時に提供されるComparatorを使って行われます。そのどちらになるかは、使用するコンストラクタによって決まります。null要素を許容しません。

使い方

インスタンスを生成して利用するので以下の書式となります。

HashSet<要素の型> 変数 = new HashSet<要素の型>();

LinkedHashSet<要素の型> 変数 = new LinkedHashSet<要素の型>();

TreeSet<要素の型> 変数 = new TreeSet<要素の型>();

主なメソッド

booleanadd(E e)指定された要素がセットの要素として存在しない場合に、その要素をセットに追加します。
voidclear()このセットからすべての要素を削除します。
Objectclone()インスタンスのシャロー・コピーを返します。
booleancontains(Object o)指定の要素がこのセットに含まれている場合にtrueを返します。
booleanremove(Object o)指定された要素がこのセットにあれば、その最初のものをリストから削除します。
intsize()このセット内にある要素の数を返します。

*Eは要素の型に依存しています。

上記のメソッドは主なものでHashSetとLinkedHashSetとTreeSetに共通したものです。

他にもそれぞれのクラスで便利なメソッドが用意されているので公式サイトを参照してください。

サンプルコード

    String[] foo1 = {"大福", "団子", "まんじゅう", "おはぎ"};
    HashSet<String> hashset = new HashSet<String>();
    for (int i=0; i<foo1.length; i++) {
      hashset.add(foo1[i]);
    }
    hashset.add("大福"); // 重複した要素の追加
    hashset.add(null); // nullの追加
    System.out.println("HashSet: "+hashset.toString());
    LinkedHashSet<String> linkedhashset = new LinkedHashSet<String>();
    for (int i=0; i<foo1.length; i++) {
      linkedhashset.add(foo1[i]);
    }
    linkedhashset.add("大福"); // 重複した要素の追加
    linkedhashset.add(null); // nullの追加
    System.out.println("LinkedHashSet: "+linkedhashset.toString());
    TreeSet<String> treeset = new TreeSet<String>();
    for (int i=0; i<foo1.length; i++) {
      treeset.add(foo1[i]);
    }
    treeset.add("大福"); // 重複した要素の追加
    System.out.println("TreeSet: "+treeset.toString());

【表示結果】

HashSet: [null, おはぎ, 大福, まんじゅう, 団子]
LinkedHashSet: [大福, 団子, まんじゅう, おはぎ, null]
TreeSet: [おはぎ, まんじゅう, 団子, 大福] 

Mapについて

Mapはキーを値にマッピングするコレクションです。

他言語でいう連想配列、キー配列、ディクショナリなどを想像するとわかりやすいかと思います。

MapはインターフェイスなのでMapを実装したクラスのインスタンスを生成して利用します。

以下は主なクラスです。

HashMapこのクラスは、その順序を一定に保つことを保証しません。nullキーとnull要素を使用できます。
LinkedHashMapこのクラスは、すべてのエントリをまたがる二重のリンク・リストを保持するという点で、HashMapとは異なります。反復順序を定義し順序は、キーがマップに挿入された順序となります(挿入順)。
TreeMap使用するコンストラクタに応じて、そのキーの自然順序付けに従って、またはマップ作成時に提供されるComparatorによってソートされます。

使い方

インスタンスを生成して利用するので以下の書式となります。

HashMap<キーの型, 値の型> 変数 = new HashMap<キーの型, 値の型>();

LinkedHashMap<キーの型, 値の型> 変数 = new LinkedHashMap<キーの型, 値の型>();

TreeMap<キーの型, 値の型> 変数 = new TreeMap<キーの型, 値の型>();

主なメソッド

voidclear()すべてのマッピングをマップから削除します。
Objectclone()インスタンスのシャロー・コピーを返します。
booleancontainsKey(Object key)指定のキーのマッピングがこのマップに含まれている場合にtrueを返します
booleancontainsValue(Object value)このマップが1つまたは複数のキーを指定された値にマッピングしている場合にtrueを返します。
Vget(Object key)指定されたキーがマップされている値を返します。このマップにそのキーのマッピングが含まれていない場合はnullを返します。
Vput(K key, V value)指定された値と指定されたキーをこのマップに関連付けます。
Vremove(Object key)指定されたキーのマッピングがあればマップから削除します。
booleanremove(Object key, Object value)指定された値に指定されたキーが現在マッピングされている場合にのみ、そのキーのエントリを削除します。
Vreplace(K key, V value)指定されたキーがなんらかの値に現在マッピングされている場合にのみ、そのキーのエントリを置換します。
intsize()このマップ内にあるキーと値のマッピングの数を返します。

*Kはキー、Vは値の型に依存しています。

上記のメソッドは主なものでHashMapとLinkedHashMapとTreeMapに共通したものです。

他にもそれぞれのクラスで便利なメソッドが用意されているので公式サイトを参照してください。

サンプルコード

    String[] foo2 = {"ケーキ", "プリン", "アイス", "チョコレート"};
    HashMap<String, String> hashmap = new HashMap<String, String>();
    LinkedHashMap<String, String> linkedhashmap = new LinkedHashMap<String, String>();
    TreeMap<String, String> treemap = new TreeMap<String, String>();
    for (int i=foo2.length; i>0; i--) {
      hashmap.put(String.valueOf(i), foo2[i-1]);
      linkedhashmap.put(String.valueOf(i), foo2[i-1]);
      treemap.put(String.valueOf(i), foo2[i-1]);
    }
    System.out.println("HashMap: "+hashmap.toString());
    System.out.println("LinkedHashMap: "+linkedhashmap.toString());
    System.out.println("TreeMap: "+treemap.toString());

【表示結果】

HashMap: {1=ケーキ, 2=プリン, 3=アイス, 4=チョコレート}
LinkedHashMap: {4=チョコレート, 3=アイス, 2=プリン, 1=ケーキ}
TreeMap: {1=ケーキ, 2=プリン, 3=アイス, 4=チョコレート}