コレクションフレームワーク 第1回 Collectionとは

s.arakawa

Collection

プログラムを書いていると、多数のデータを扱う機会が多々あります。その場合に、全てデータ構造を自分で用意してもプログラムすることができますが、Javaにはもともとそのデータ構造を表現できるクラス群が用意されています。
これらのクラスはコレクションフレームワークと呼ばれ、うまく使用することによってプログラムを簡単に書くことができます。

Collectionに属するクラス

コレクションフレームワークに含まれるクラス/インターフェースは次のようなものがあります。

クラス/インターフェース 意味
java.util.List 順序付きリストのインターフェース
java.util.ArrayList 配列を用いたjava.util.Listの実装
java.util.LinkedList リンクリストを用いたjava.util.Listの実装
java.util.Set 重複を許さない集合のインターフェース
java.util.HashSet ハッシュを用いたjava.util.Setの実装
java.util.TreeSet 二分探索木を用いたjava.util.Setの実装

また、コレクションに深い関わりのあるMapというデータ構造があります。
このデータ構造は、キーのペアを表現するためのもので、辞書のようなものです。
辞書は単語をキーにして意味や用例などのを取得することができます。

クラス/インターフェース 意味
java.util.Map キーと値のペアを表す構造のインターフェース
java.util.HashMap キーの検索にハッシュを用いたjava.util.Mapの実装
java.util.TreeMap キーの検索に二分探索木を用いたjava.util.Mapの実装

これらのクラスやインターフェースはJavaで元々用意されているもので、機能に不満があれば自分で機能を追加したクラスを作成することもできます。
しかし、ここに挙げたもので事足りるのであれば、わざわざ再開発しないで安全で高速なこれらのクラスを使用することをお勧めします。

Collectionインターフェース

java.util.Collectionはインターフェースです。
よって、そのままインスタンスを生成することができません。

import java.util.Collection;

public class C0S1 {
  public static void main(String[] args) {
    Collection c = new Collection();
  }
}
> javac C0S1.java
C0S1.java:5: java.util.Collection は abstract です。インスタンスを生成することはできません。
    Collection c = new Collection();
                   ^
エラー 1 個

そのため、Collectionインターフェースを実装するクラスを使用する必要があります。

import java.util.Collection;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.HashSet;
import java.util.TreeSet;

public class C0S2 {
  public static void main(String[] args) {
    Collection c1 = new ArrayList();
    Collection c2 = new LinkedList();
    Collection c3 = new HashSet();
    Collection c4 = new TreeSet();
    
    System.out.println("c1 = " + c1.getClass());
    System.out.println("c2 = " + c2.getClass());
    System.out.println("c3 = " + c3.getClass());
    System.out.println("c4 = " + c4.getClass());
  }
}
> javac C0S2.java
> java C0S2
c1 = class java.util.ArrayList
c2 = class java.util.LinkedList
c3 = class java.util.HashSet
c4 = class java.util.TreeSet

注意すべき点は、java.util.Mapはコレクションを実装しません。

Collectionが持つ機能

java.util.Collectionが持つメソッドのうち、特に使用されると思われるものを抜粋します。

add(Object o)

コレクションにオブジェクトを追加する

import java.util.Collection;
import java.util.ArrayList;

public class C1S1 {
  public static void main(String[] args) {
    Collection c = new ArrayList();
    c.add("hoge");
    c.add("foo");
    c.add("bar");
    System.out.println(c.toString());
  }
}
> java C1S1
[hoge, foo, bar]

remove(Object o)

コレクションからオブジェクトを削除する

import java.util.Collection;
import java.util.ArrayList;

public class C1S2 {
  public static void main(String[] args) {
    Collection c = new ArrayList();
    c.add("hoge");
    c.add("foo");
    c.add("bar");
    c.remove("foo");
    System.out.println(c.toString());
  }
}
> java C1S2
[hoge, bar]

contains(Object o)

コレクションに対象のオブジェクトが含まれているか検査する

import java.util.Collection;
import java.util.ArrayList;

public class C1S3 {
  public static void main(String[] args) {
    Collection c = new ArrayList();
    c.add("hoge");
    c.add("foo");
    System.out.println(c + " contains \"foo\" ? > " + c.contains("foo"));
    System.out.println(c + " contains \"bar\" ? > " + c.contains("bar"));
  }
}
> java C1S3
[hoge, foo] contains "foo" ? > true
[hoge, foo] contains "bar" ? > false

size()

コレクションに格納されているオブジェクトの個数を取得する。

import java.util.Collection;
import java.util.ArrayList;

public class C1S4 {
  public static void main(String[] args) {
    Collection c = new ArrayList();
    c.add("hoge");
    c.add("foo");
    c.add("bar");
    System.out.println(c.size());
  }
}
> java C1S4
3

isEmpty()

コレクションが空かどうか検査する。

import java.util.Collection;
import java.util.ArrayList;

public class C1S5 {
  public static void main(String[] args) {
    Collection c = new ArrayList();
    System.out.println(c + " is Empty ? > " + c.isEmpty());
    c.add("hoge");
    c.add("foo");
    c.add("bar");
    System.out.println(c + " is Empty ? > " + c.isEmpty());
  }
}
> java C1S5
[] is Empty ? > true
[hoge, foo, bar] is Empty ? > false