Java 基本 コレクションフレームワーク

Javaのクラスであるコレクションフレームワークについて説明します。


コレクションフレームワークはJavaプログラミングをするにあたって必ずといってよいほど利用されますので必ず理解してください。

コレクションフレームワークとは何か?

コレクションとは複数の要素の集まりのことです。その要素の集まりを扱う機能なのでコレクションフレームワークと言います。

コレクションフレームワークでは複数の要素(データ)を扱うための便利機能を提供します。

具体的には以下3つの種類のインターフェースから成ります。

  1. List
  2. Map
  3. Set

それぞれで意味や機能が異なるため、それぞれの特性を知る必要があります。

Listとは何か!?

Listとは複数の要素の順番を保持するコレクションです。

インデックスを利用して要素にアクセスするため、配列の代わりとして利用することができます。

List-image

Listのイメージ図

配列の場合、宣言時に必要な個数を指定する必要がありましたが、Listでは後から要素数を変更することが出来るのが特徴です。

実装はいくつかあるのですが、よく利用するものから説明すると以下になります。

  • ArrayList
  • LinkedList
  • Vector

※Vectorは互換性のためだけに存在し、古いソースで利用されます。ArrayListが上位互換のクラスになるため詳細は割愛します。

クラス 任意の要素へのアクセス 要素の途中追加、削除
ArrayList 高速 低速
LindedList 低速 高速

List宣言例

List<[要素の型]> 変数名 = new ArrayList<[要素の型]>();
List<[要素の型]> 変数名 = new LinkedList<[要素の型]>();

Listサンプルソース

import java.util.ArrayList;
import java.util.List;

public class ListSample {

  public static void main(String[] args) {
    List<String> list = new ArrayList<String>();

    //値のセットはaddメソッドを利用
    list.add("1");
    list.add("2");
    list.add("3");
    list.add("4");
    list.add("5");

    //値の取得
    for (int i = 0; i < list.size() -1; i++) {
      //値の取得はgetメソッドを利用
      System.out.println(list.get(i));
    }

    //拡張for文を利用するともっと簡単
    for (String s : list) {
      System.out.println(s);
    }
  }
}

Listサンプルソース実行結果

1
2
3
4
1
2
3
4
5

Mapとは何か!!

Mapとはキーと要素とのマッピングを表すデータ構造のインターフェースです。

インデックスではなく、キーで要素を識別して値を取得します。

Map-image

Mapイメージ

実装はいくつかあるのですが、よく利用するものから説明すると以下になります。

  • HashMap
  • TreeMap
  • LinkedHashMap
  • Hashtable

※Hashtableは互換性のためだけに存在し、古いソースで利用されます。HashMapが上位互換のクラスになるため詳細は割愛します。

クラス null可 順番
HashMap 保障しない
TreeMap デフォルトは登録したキーの自然順序(昇順)
LinkedHashMap 登録した順番

Map宣言例


Map<key, [要素の型]> 変数名 = new HashMap<key, [要素の型]>();
Map<key, [要素の型]> 変数名 = new TreeMap<key, [要素の型]>();
Map<key, [要素の型]> 変数名 = new LinkedHashMap<key, [要素の型]>();

Mapサンプルソース

import java.util.HashMap;
import java.util.Map;

public class MapSample {

  public static void main(String[] args) {
    Map<String, String> map = new HashMap<String, String>();

    //値のセットはputメソッドを利用
    map.put("key1", "value1");
    map.put("key2", "value2");
    map.put("key3", "value3");
    map.put("key4", "value4");
    map.put("key5", "value5");

    //値の取得
    String value = map.get("key1"); //value1が取得できる
    System.out.println(value);

    String valueNull = map.get("key6"); //存在しないkeyの場合はnull
    System.out.println(valueNull);

    //mapに該当するkeyが存在するか否かチェックすることも可能
    if (map.containsKey("key1")) {
      System.out.println("key1は存在します");
    } else {
      System.out.println("key1は存在しません");
    }

    //拡張for文を利用してすべて情報を取得する
    for(Map.Entry<String, String> e : map.entrySet()) {
      System.out.println(e.getKey() + " : " + e.getValue());
    }
  }
}

Mapサンプルソース実行結果

value1
null
key1は存在します
key1 : value1
key2 : value2
key5 : value5
key3 : value3
key4 : value4

Setとは何か!!

Setとは重複要素を持たない要素の集合を表すインターフェースです。

Set-image

Setイメージ

実装はいくつかあるのですが、よく利用するものから説明すると以下になります。

  • HashSet
  • TreeSet
  • LinkedHashSet

クラス 重複 順番
HashSet なし 保障しない
TreeSet なし デフォルトは登録したキーの自然順序(昇順)
LinkedHashSet なし 登録した順番

Set宣言例


Set<[要素の型]> 変数名 = new HashSet<[要素の型]>();
Set<[要素の型]> 変数名 = new TreeSet<[要素の型]>();
Set<[要素の型]> 変数名 = new LinkedHashSet<[要素の型]>();

Setサンプルソース


import java.util.HashSet;
import java.util.Set;

public class SetSample {

  public static void main(String[] args) {
    Set<String> set = new HashSet<String>();

    //値のセットはaddメソッドを利用
    set.add("value1");
    set.add("value2");
    set.add("value3");
    set.add("value4");
    set.add("value5");

    set.add("value2"); //重複要素をadd

    //拡張For文を利用
    for (String s : set) {
      System.out.println(s);
    }
  }
}

Setサンプルソース実行結果

value5
value2
value1
value4
value3

重複を排除したい場合に一旦Setにデータを入れて、すべて取り出すといった使い方をすることが多いです。

終わりに

今回はコレクションフレームワークの内、利用頻度の高い実装クラスを紹介しました。

8割、9割は今回紹介したクラスで問題ないと思われますが、必要に応じてその他実装クラスを利用してみてください。

また、特に説明もせず利用してましたが実はクラスとインターフェース(オブジェクト指向)を理解すると、以下のサンプルプログラムも納得してもらえると思います。


//この書き方でもOKだけど、、、
ArrayList<[要素の型]> 変数名 = new ArrayList<[要素の型]>();

//実際はこのように記述されることが多い
List<[要素の型]> 変数名 = new ArrayList<[要素の型]>();

さらに、宣言時に利用する要素の型を明示的に記入しましたが、下記のようにも記述することが出来ます。

//この書き方でもOKだけど、、、
List 変数名 = new ArrayList();

//実際はこのように記述されることが多い
List<[要素の型]> 変数名 = new ArrayList<[要素の型]>();


特に古いソース(JDK1.5以前に書かれたソース)ではこの記述がされていると思います。

これはジェネリクスといってJDK1.5からさポートされるようになった機能です。

Javaは変数の型を厳格にチェックする言語ですが、ジェネリクスが無い時代はListにいろいろな型のデータを詰め込むことが可能でした(あまりそのような使い方はしないことがおおいですが。。。)

型をあらかじめ決めることができるのでジェネリクスで記述した場合、拡張For文を利用することもできるようになり値の取出しが楽になりました。

スポンサーリンク
スポンサードリンク
スポンサードリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする