コレクション

可変長配列(ArrayList)

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

class ColArr01
{
    public static void main(String args[])
    {
        List<Integer> lst = new ArrayList<>();
        lst.add(100);
        Integer n = 200;
        lst.add(n);
        int a = 300;
        lst.add(a);
        lst.add(100);
        System.out.println(lst.size()); // 4
        for(int i: lst)
            System.out.println(i);      // 100 200 300 100
        lst.remove(1);                  // インデックスの要素を削除
        lst.set(1111);                // インデックスの要素を設定(変更)
        lst.add(2222);                // インデックスに挿入
        System.out.println(lst.get(1)); // 111 インデックスの要素を取得
        for(int i: lst)
            System.out.println(i);      // 100 111 222 100
        lst.clear();
    }
}
Listインタフェースは、任意のデータ型の要素からなる可変長な配列の機能を提供します。
ArrayListはListインタフェースの代表的な実装クラスです。可変長配列のデータ型は、ジェネリック型により任意に指定します。
インスタンスをListインタフェースではなく、次のように直接実装クラスのインスタンスとして生成してもかまいません。
ArrayList<Integer> lst = new ArrayList<>();
newの実装クラスのジェネリック型指定を省略せずに記述してもかまいません。
List<Integer> lst = new ArrayList<Integer>();
Listインタフェースの主なメソッドは以下の通りです。
add([int index,] 要素) 要素を追加する。
set(int index, 要素) 指定インデックスに要素を設定する。
要素型 get(int index) 指定インデックスの要素を取得する。
remove(int index) 指定要素を削除する。削除した前後の要素は連結される。
int size() 要素数を返す。
clear() 要素を全て削除して空にする。
boolean isEmpty() リストが空か。

セット(HashSet)

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

class ColSet01
{
    public static void main(String args[])
    {
        Set<String> hs = new HashSet<>();
        hs.add("ABC");
        hs.add("DEF");
        hs.add("GHI");
        hs.add("ABC");                  // 追加されない(セットは重複しない)
        System.out.println(hs.size());  // 3
        for (String s: hs)
            System.out.println(s);      // ABC DEF GHI
        hs.remove("DEF");               // 指定要素を削除
        for (String s: hs)
            System.out.println(s);      // ABC GHI
        hs.clear();
    }
}
Setインタフェースは、任意のデータ型の要素からなるオブジェクトのセット(集合)を提供します。
HashSetはSetインタフェースの代表的な実装クラスです。セットは同じ要素が重複しない順不同な集合です。配列のようなインデックスによる順番管理はされていませんが、イテレーションにより内部的な順番で取り出して参照することはできます。セットのデータ型は、ジェネリック型により任意に指定します。
インスタンスをSetインタフェースではなく、次のように直接実装クラスのインスタンスとして生成してもかまいません。
HashSet<String> hs = new HashSet<>();
newの実装クラスのジェネリック型指定を省略せずに記述してもかまいません。
Set<String> hs = new HashSet<String>();
Setインタフェースの主なメソッドは以下の通りです。
add(要素) 要素を追加する。
remove(要素) 指定要素を削除する。
int size() 要素数を返す。
clear() 要素を全て削除して空にする。
boolean isEmpty() セットが空か。

マップ(HashMap)

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

class ColMap01
{
    public static void main(String args[])
    {
        Map<String, Integer> hm = new HashMap<>();
        hm.put("ABC"100);
        hm.put("DEF"200);
        hm.put("GHI"300);
        for (String key: hm.keySet())               // キーをイテレーション
            System.out.println(key + hm.get(key));  // ABC100 DEF200 GHI300
        hm.remove("DEF");                           // キーの要素を削除
        hm.replace("GHI"333);                     // キーの値を置き換え
        for (Integer val: hm.values())              // 値をイテレーション
            System.out.println(val);                // 100 333
        hm.clear();
    }
}
Mapインタフェースは、キーと値の組み合わせた要素からなるマップ(辞書)を提供します。
HashMapはMapインタフェースの代表的な実装クラスです。マップはキーが重複しない要素が順不同な辞書の集合です。配列のようなインデックスによる順番管理はされていませんが、イテレーションにより内部的な順番で取り出して参照することはできます。キーの集合をKeySet()メソッドで、値の集合をvalues()メソッドで取得してそれぞれをイテレーションできます。キーと値のそれぞれのデータ型は、ジェネリック型により任意に指定します。
インスタンスをMapインタフェースではなく、次のように直接実装クラスのインスタンスとして生成してもかまいません。
HashMap<String, Integer> hm = new HashMap<>();
newの実装クラスのジェネリック型指定を省略せずに記述してもかまいません。
Map<String, Integer> hm = new HashMap<String, Integer>();
Mapインタフェースの主なメソッドは以下の通りです。
put(キー) キーおよび対応する値を追加する。
値型 get(キー) キーに対応する値を取得する。
replace(キー) キーに対応する値を置き換える(変更する)。
remove(キー) キーの要素をマップから削除する。
Set<キー型> keySet() キーだけからなるセットを取得する。
Collection<値型> values() 値だけからなるコレクションを取得する。
int size() 要素数を返す。
clear() 要素を全て削除して空にする。
boolean isEmpty() マップが空か。

デック(ArrayDeque)

import java.util.Deque;
import java.util.ArrayDeque;

class ColQue01
{
    public static void main(String args[])
    {
        Deque<Integer> q = new ArrayDeque<>();
        // スタックとしての振る舞い 
        q.addLast(100);                             // 末尾に追加
        q.addLast(200);
        q.addLast(300);
        for (Integer i: q) 
            System.out.println(i);                  // 100 200 300
        while (q.size() > 0)
            System.out.println(q.removeLast());     // 300 200 100

        // キューとしての振る舞い 
        q.addFirst(100);                            // 先頭に追加
        q.addFirst(200);
        q.addFirst(300);
        while (q.size() > 0)
            System.out.println(q.removeFirst());    // 300 200 100

        q.addFirst(10);
        q.clear();
    }
}
Dequeインタフェースは、任意のデータ型の要素からなるデック(両端キュー)の機能を提供します。
ArrayDequeはDequeインタフェースの代表的な実装クラスです。デックは両端から出し入れ可能なキュー構造になっています。配列のようなインデックスによる参照はできませんが、オブジェクトがデックの両端からの追加順に整列しており、両端のどちらかから順番に参照・取り出しができます。デックのデータ型は、ジェネリック型により任意に指定します。
インスタンスをDequeインタフェースではなく、次のように直接実装クラスのインスタンスとして生成してもかまいません。
ArrayDeque<Integer> q = new ArrayDeque<>();
newの実装クラスのジェネリック型指定を省略せずに記述してもかまいません。
Deque<Integer> q = new ArrayDeque<Integer>();
Dequeインタフェースの主なメソッドは以下の通りです。
addFirst(要素) 先頭に要素を追加する。
addLast(要素) 末尾に要素を追加する。
要素型 removeFirst()
要素型 pollFirst()
先頭の要素を取得しデックから取り除く。
要素型 removeLast()
要素型 pollLast()
末尾の要素を取得しデックから取り除く。
要素型 getFirst()
要素型 peekFirst()
先頭の要素を取得する。
要素型 getLast()
要素型 peekLast()
末尾の要素を取得する。
int size() 要素数を返す。
clear() 要素を全て削除して空にする。
boolean isEmpty() デックが空か。
removeやgetでデックが空の場合はNoSuchElementException例外のスローとなります。pollやpeekではそのかわりにnullを返します。

双方向リスト(LinkedList)

import java.util.LinkedList;

class ColList01
{
    public static void main(String args[])
    {
        LinkedList<String> ll = new LinkedList<>();

        ll.addLast("ABC");
        ll.addLast("DEF");
        ll.addFirst("XYZ");
        ll.addLast("PQR");
        ll.addFirst("GHI");
        for (String s: ll)
            System.out.println(s);      // GHI XYZ ABC DEF PQR
        ll.removeFirst();               // 先頭を削除
        ll.removeLast();                // 末尾を削除
        for (String s: ll)
            System.out.println(s);      // XYZ ABC DEF
        System.out.println(ll.size());  // 3
        ll.clear();
    }
}
LinkedListクラスは、デック(Deque)と可変長な配列であるリスト(List)の両方の機能を併せ持つ双方向リストを提供します。
import java.util.LinkedList;

class ColList02
{
    public static void main(String args[])
    {
        LinkedList<String> ll = new LinkedList<>();

        ll.add("ABC");
        ll.add("DEF");
        ll.add("GHI");
        ll.add("JKL");
        for (String s: ll)
            System.out.println(s);      // ABC DEF GHI JKL
        System.out.println(ll.get(2));  // GHI インデックスの要素を取得
        ll.remove(1);                   // インデックスの要素を削除
        ll.set(0"XYZ");               // インデックスの要素を削除
        for (String s: ll)              // インデックスの要素を設定(変更)
            System.out.println(s);      // XYZ GHI JKL
        System.out.println(ll.size());  // 3
        ll.clear();
    }
}
LinkedListクラスは、DequeインタフェースとListインタフェースの両方を実装しているので、両方のメソッドを使用できます。デックの追加順に整列したものとして扱うことができ、同時に可変長配列としてインデックス参照による編集操作もできます。
可変長配列のリストとして使用する場合と、デックとして使用する場合で使い分けるならば、ListやDequeインタフェースの変数にインスタンスを生成してもかまいません。
List<String> ll = new LinkedList<>();
newの実装クラスのジェネリック型指定を省略せずに記述してもかまいません。
Deque<String> ll = new LinkedList<String>();