プログラムを書いていると、多数のデータを扱う機会が多々あります。その場合に、全てデータ構造を自分で用意してもプログラムすることができますが、Javaにはもともとそのデータ構造を表現できるクラス群が用意されています。
これらのクラスはコレクションフレームワークと呼ばれ、うまく使用することによってプログラムを簡単に書くことができます。
コレクションフレームワークに含まれるクラス/インターフェースは次のようなものがあります。
クラス/インターフェース | 意味 |
---|---|
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で元々用意されているもので、機能に不満があれば自分で機能を追加したクラスを作成することもできます。
しかし、ここに挙げたもので事足りるのであれば、わざわざ再開発しないで安全で高速なこれらのクラスを使用することをお勧めします。
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はコレクションを実装しません。
java.util.Collectionが持つメソッドのうち、特に使用されると思われるものを抜粋します。
コレクションにオブジェクトを追加する
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]
コレクションからオブジェクトを削除する
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]
コレクションに対象のオブジェクトが含まれているか検査する
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
コレクションに格納されているオブジェクトの個数を取得する。
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
コレクションが空かどうか検査する。
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