ためになるホームページ お問い合わせ




TOP > Java > コレクション
コレクション
他のオブジェクトを格納するためのオブジェクト。コンテナと呼ばれることもある。具体的には、HashMapやArrayListなどがある。

コレクションでできる操作
  • オブジェクトをコレクションに追加する
  • オブジェクトをコレクションから削除する
  • コレクション内でオブジェクトを検索する(複数のオブジェクトの検索も可)
  • コレクションからオブジェクトを取り出す(削除はしない)
  • コレクションの要素(オブジェクト)を一個ずつ順に調べる

  • コレクションの基本タイプ
  • リスト--物事を最も単純な形で格納するコレクション(Listインタフェースの実装クラス)
  • セット--一意の物事を格納するコレクション(Setインタフェースの実装クラス)
  • マップ--一意のIDを持つ物事を格納するコレクション(Mapインタフェースの実装クラス)

  • コレクションフレームワーク
    インタフェース、実装、アルゴリズムの3つの要素で構成されているフレームワーク。セット(要素の重複を認めない)、リスト(インデックス位置でアクセス可能)、マップ(一意の識別子で可能)の三種類がある。

    コレクションフレームワークの主要なインタフェースとクラス
    java.util内パッケージ内のインターフェース
    Collection Set SortedSet
    List Map SortedMap

    主な実装クラス
    Mapの実装 Setの実装 Listの実装
    HashMap HashSet ArrayList
    HashTable LinkedHashSet Vector
    TreeMap TreeSet LinkedList
    LinkedHashMap   s 

    実装クラスは、「ソートも順序もなし」「順序付きでソートなし」「順序付きでソート済み」の3種類がある。また、コレクションで「反復処理」と言うのは、「先頭の要素から順に各要素を見ていくこと。但し、「先頭」という概念がない場合もある。

    インタフェース List
    順序付けられたコレクションです。「シーケンス」とも呼ばれます。このインタフェースのユーザは、リスト内のどこに各要素が挿入されるかを精密に制御できます。ユーザは整数値のインデックス (リスト内の位置) によって要素にアクセスしたり、リスト内の要素を検索したりすることができます。セットとは異なり、通常、リストは重複する要素を許可します。つまり、リストは、通常 e1.equals(e2) となるような、e1 と e2 の要素のペアを許可します。また、null 要素を許可する場合には、通常は複数の null 要素を許可します。ユーザが重複する値を挿入しようとしたときに実行時の例外をスローすることにより、重複する値を禁止するリストを実装する場合もありますが、このように使われることはほとんどありません。

    ArrayListクラス
    List インタフェースのサイズ変更可能な配列の実装です。リストの任意のオペレーションをすべて実装し、null を含むすべての要素を許容します。このクラスは、List インタフェースを実装するほか、リストを格納するために内部的に使われる配列のサイズを操作するメソッドを提供します。この実装は同期化されない点に注意してください。

    ArrayListの例
    import java.util.* ;
    
    public class Test{
        public static void main(String[] args){
            ArrayList arrayList = new ArrayList() ;
            arrayList.add("abc") ;
            arrayList.add("ghi") ;
            arrayList.add("jkl") ;
            arrayList.add(1, "def") ;
    
            Iterator it = arrayList.iterator() ;
            while (it.hasNext()) {
                System.out.println(it.next()) ;
            }
        }
    }
    
    

    Vectorクラス
    オブジェクトの可変長配列を実装します。ここには配列と同じように、整数インデックスを使ってアクセスできる要素が格納されています。しかし、Vector のサイズは、作成後に追加および削除されたオブジェクトを格納できるように必要に応じて増やしたり減らしたりすることができます。 Vector は同期をとります。

    Vectorクラスの例
    import java.util.* ;
    
    public class Test{
        public static void main(String[] args){
            Vector vector = new Vector() ;
            vector.add("abc") ;
            vector.add("ghi") ;
            vector.add("jkl") ;
            vector.add(1, "def") ;
            vector.set(2, "JKL") ;
            System.out.println(vector.elementAt(1)) ;
            System.out.println(vector.elementAt(2)) ;
        }
    }
    
    

    LinkedListクラス
    List インタフェースのリンクリストの実装です。リストの任意のオペレーションをすべて実装し、null を含め、すべての要素を許可します。List インタフェースを実装するほかに、LinkedList クラスは、リストの先端および終端にある要素を取得および削除したり、先端および終端に要素を挿入したりするメソッド (get、remove、insert) を提供します。これらのオペレーションを使うと、リンクリストをスタック、キュー、または双方向キュー (デキュー) として使用できるようになります。 この実装は同期化されません。

    LinkedListクラスの例
    import java.util.* ;
    
    public class Test{
        public static void main(String[] args){
            LinkedList li = new LinkedList() ;
            li.add("abc") ;
            li.add("ghi") ;
            li.add("jkl") ;
            li.add(1,"def") ;
            li.remove(0) ;
            Iterator it = li.iterator() ;
            while (it.hasNext()) {
                System.out.println(it.next()) ;
            }
        }
    }
    
    

    インタフェース Set
    重複要素のないコレクションです。すなわち、セットは、e1.equals(e2) である e1 と e2 の要素ペアは持たず、null 要素を最大 1 つしか持ちません。その名前が示すように、このインタフェースは、数学で言う集合の抽象化をモデル化します。 コンストラクタについての追加規定として、すべてのコンストラクタは、重複要素のないセットを作成しなければなりません 。

    HashSetクラス
    このクラスは、ハッシュテーブル (実際には HashMap のインスタンス) を基にし、Set インタフェースを実装します。このクラスでは、セットの繰り返し順序について保証しません。特に、その順序を一定に保つことを保証しません。このクラスは、null 要素を許容します。この実装は同期化されません。

    HashSetクラスの例
    import java.util.* ;
    
    public class Test{
        public static void main(String[] args){
            HashSet ha = new HashSet() ;
            ha.add("z") ;
            ha.add("jkl") ;
            ha.add(null) ;
            ha.add(null) ;
            Iterator it = ha.iterator() ;
            while (it.hasNext()) {
                System.out.println(it.next()) ;
            }
        }
    }
    
    

    LinkedHashSetクラス
    予測可能な繰り返し順序を持つ Set インタフェースのハッシュテーブルとリンクリストの実装です。この実装は、すべての実装のエントリを経る二重のリンクリストを保持するという点で、HashSet とは異なります。リンクリストは、繰り返し順序を定義します。この順序は、要素がセットに挿入された順序です (挿入順) 。要素をセットに「再挿入」する場合、挿入順は影響を受けません。呼び出しの直前に、s.contains(e) が true を返すときに s.add(e) が呼び出された場合、要素 e がセット s に再挿入されます。 この実装は同期化されません。

    LinkedHashSetクラスの例
    import java.util.* ;
    
    public class Test{
        public static void main(String[] args){
            LinkedHashSet li = new LinkedHashSet() ;
            li.add("z") ;
            li.add("jkl") ;
            li.add(null) ;
            li.add(null) ;
            Iterator it = li.iterator() ;
            while (it.hasNext()) {
                System.out.println(it.next()) ;
            }
        }
    }
    
    

    TreeSetクラス
    このクラスは、TreeMap のインスタンスに基づく Set インタフェースを実装します。このクラスでは、ソートセットが確実に要素の昇順でソートされます。ただし、ソート方法は、使用されるコンストラクタにより異なり、要素の「自然順序付け」(Comparable を参照) によりソートされる場合と、セット作成時に提供されるコンパレータによりソートされる場合があります。この実装は同期化されません。

    TreeSetクラスの例
    import java.util.* ;
    
    public class Test{
        public static void main(String[] args){
            TreeSet tr = new TreeSet() ;
            tr.add("jkl") ;
            tr.add("abc") ;
            tr.add("ghi") ;
            Iterator it = tr.iterator() ;
            while (it.hasNext()) {
                System.out.println(it.next()) ;
            }
        }
    }
    

    インタフェース Map
    キーを値にマッピングするオブジェクトです。マップには、同一のキーを複数登録することはできません。各キーは 1 つの値にしかマッピングできません。

    HashMapクラス
    Map インタフェースのハッシュテーブルに基づく実装です。この実装は、マップに関連するオプションのオペレーションをすべてサポートし、null 値および null キーを使用できます。この実装は同期化されません。

    HashMapクラスの例
    import java.util.*;
    class MapEcho {
      public void get(HashMap map) {
        Iterator it = map.keySet().iterator();
        Object id;
        while (it.hasNext()) {
          id = it.next();
          System.out.println(id + " = " + map.get(id));
        }
      }
    }
    class Test {
      public static void main(String[] args) {
        HashMap user = new HashMap();
        int[] serial = {1,2,3};
        String[] name = {"Yamada","Tanaka","Sato"};
        
        for (int i = 0; i < 3; i++) {
          user.put(new Integer(serial[i]), name[i]);
        }
        MapEcho ma = new MapEcho();
        ma.get(user);
      }
    }
    
    

    Hashtableクラス
    このクラスは、ハッシュテーブルを実装するためのもので、キーを値にマップします。null オブジェクト以外であれば、どのオブジェクトでもキーや値に使用することができます。Hashtable は同期をとります。

    Hashtableクラスの例
    import java.util.*;
    class HashTableEcho {
      public void get(Hashtable map) {
        Iterator it = map.keySet().iterator();
        Object id;
        while (it.hasNext()) {
          id = it.next();
          System.out.println(id + " = " + map.get(id));
        }
      }
    }
    class Test {
      public static void main(String[] args) {
        Hashtable user = new Hashtable();
        int[] serial = {1,2,3,4};
        String[] name = {"Yamada","Tanaka","oyama","Sato"};
        
        for (int i = 0; i < 4; i++) {
          user.put(new Integer(serial[i]), name[i]);
        }
        HashTableEcho ma = new HashTableEcho();
        ma.get(user);
      }
    }
    
    
    

    LinkedHashMapクラス
    予測可能な繰り返し順序を持つ Map インタフェースのハッシュテーブルとリンクリストの実装です。この実装は、すべての実装のエントリを経る二重のリンクリストを保持するという点で、HashMap とは異なります。リンクリストは、繰り返し順序を定義します。この順序は、通常キーがマップに挿入された順序です (挿入順) 。キーをマップに「再挿入」する場合、挿入順は影響を受けません。この実装は同期化されません。

    LinkedHashMapクラスの例
    import java.util.*;
    class TestLinkedHashMap {
      public void get(LinkedHashMap map) {
        Iterator it = map.keySet().iterator();
        Object id;
        while (it.hasNext()) {
          id = it.next();
          System.out.println(id + " = " + map.get(id));
        }
      }
    }
    class Test {
      public static void main(String[] args) {
        LinkedHashMap user = new LinkedHashMap();
        int[] serial = {1,2,3,4};
        String[] name = {"Yamada","Tanaka","oyama","Sato"};
        
        for (int i = 0; i < 4; i++) {
          user.put(new Integer(serial[i]), name[i]);
        }
        TestLinkedHashMap ma = new TestLinkedHashMap();
        ma.get(user);
      }
    }
    
    

    LinkedHashMapクラス
    SortedMap インタフェースの実装に基づく Red-Black ツリーです。このクラスでは、マップが確実にキーの昇順でソートされます。ただし、ソート方法はコンストラクタにより異なり、キーのクラスの「自然順序付け」(Comparable を参照) によりソートされる場合と、作成時に提供されるコンパレータによってソートされる場合があります。 この実装は同期化されません。

    LinkedHashMapクラスの例
    import java.util.*;
    class TestTreeMap {
      public void get(TreeMap map) {
        Iterator it = map.keySet().iterator();
        Object id;
        while (it.hasNext()) {
          id = it.next();
          System.out.println(id + " = " + map.get(id));
        }
      }
    }
    class Test {
      public static void main(String[] args) {
        TreeMap user = new TreeMap();
        int[] serial = {3,1,2,4};
        String[] name = {"Yamada","Tanaka","oyama","Sato"};
        
        for (int i = 0; i < 4; i++) {
          user.put(new Integer(serial[i]), name[i]);
        }
        TestTreeMap ma = new TestTreeMap();
        ma.get(user);
      }
    }
    
    

    各クラスのまとめ
    クラス名 Map Set List 順序付 ソート済 同期
    HashMap     なし なし ×
    HashTable     なし なし
    TreeMap     ソート済 自然順序か独自の比較規則に基づく ×
    LinkdHashMap     挿入順かアクセス順に基づく なし ×
    HashSet     なし なし ×
    TreeSet     ソート済 自然順序か独自の比較規則に基づく ×
    LinkedHashSet     挿入順かアクセス順に基づく なし ×
    ArrayList     インデックスに基づく なし ×
    Vector     インデックスに基づく なし
    LinkedList     インデックスに基づく なし ×





    Copyright 2007 ためになるホームページ All Rights Reserved.