コレクションの代表的なクラス

コレクションは、たくさんのインスタンスを管理する目的を持った
クラスやインターフェースの総称です。
コレクションフレームワークとも呼ばれます。

コレクションに含まれる代表格として、

- ArrayList
- LinkedList
- HashSet
- HashMap

などが存在します。

以下より順に見ていきます。

## ArrayList
ArrayList は、要素を追加したり削除したりすると
自動的にサイズとインデックスが調整される配列のようなものです。

```java:ArrayListSample.java
import java.util.ArrayList;
import java.util.List;

public class ArrayListSample {

    public static void main(String args[]) {

        //ArrayListの生成とデータのセット
        List<String> al = new ArrayList<String>();
        al.add("A");
        al.add("B");
        al.add("C");
        al.add("B");
        //ArrayListを1件ずつ取り出し画面に表示する
        for (String alphabet : al) {
            System.out.println(alphabet);
        }
        // C のインデックスを表示
        System.out.println("Cの位置: " + al.indexOf("C"));
        // サイズを表示
        System.out.println("サイズ: " + al.size());
        
        // 2番目に新たに文字列を挿入
        System.out.println();
        System.out.println("2番目に新たに文字列を挿入");
        al.add(2, "X");
        System.out.println();
        
        //変更後の結果を表示
        for (String alphabet : al) {
            System.out.println(alphabet);
        }
        System.out.println("変更後のCの位置: " + al.indexOf("C"));
        System.out.println("変更後のサイズ: " + al.size());
    }
}
```

出力結果

```
A
B
C
B
Cの位置: 2
サイズ: 4

2番目の位置に新たに文字列を挿入

A
B
X
C
B
変更後のCの位置: 3
変更後のサイズ: 5
```

### なぜArrayList のインスタンスを List 型で宣言するのか
上記の例で

```
List<String> al = new ArrayList<String>();
```

と宣言する理由を[こちらの記事](http://qiita.com/BumpeiShimada/items/da36bc98e140f2a4b9d1)にまとめました。



## LinkedList
LinkedList は、要素の挿入や削除を高速に行うことのできる
クラスです。
ArrayList と比べ、挿入と削除は高速に行いますが、
指定したインデックスにある要素を参照する速度は低速です。

```java:LinkedListSample.java
import java.util.LinkedList;
import java.util.List;

public class LinkedListSample {

    public static void main(String args[]) {

        //LinkedListの生成とデータのセット
        List<String> ll = new LinkedList<String>();
        ll.add("A");
        ll.add("B");
        ll.add("C");
        ll.add("C");

        //LinkedListを1件ずつ取り出し画面に表示する
        Iterator<String> it = ll.iterator();
        while (it.hasNext()) {
            System.out.println((String)it.next());
        }
    }
}
```

出力結果

```
A
B
C
C
```

### キューの用途に使われる
挿入と削除が高速であるという理由で、
常に要素が末尾に追加され、先頭から取り出されていく
キューとして用いられるよう、LinkedList は
Queue インターフェースも実装しています。

### スタックの用途にも使われる
上記と同様の理由で、
常に要素が先頭に追加され、先頭から取り出されていく
スタックとしての用途にも使われます。

## ArrayList と LinkedList の違い
[それぞれの長所と短所を別途記事にまとめました。](http://qiita.com/BumpeiShimada/items/522798a380dc26c50a50)

## HashSet
HashSet は、順番を意識せずに、ある要素が
含まれているかどうかだけを調べることのできる集合です。
同じ要素を重複させることは出来ないようになっています。

```java:HashSetSample.java
import java.util.HashSet;
import java.util.Iterator;

public class HashSetSample {

    public static void main(String args[]) {

        //HashSetデータを作成
        HashSet<String> hs = new HashSet<String>();
        hs.add("Z");
        hs.add("Y");
        hs.add("Y");
        hs.add("X");
        hs.add(null);

        //画面表示
        Iterator<String> it = hs.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}
```

出力結果

```
null
Y
X
Z
```

同じ値は上書きされます。また要素の順番は保証されないので、格納順とは限りません。

## HashMap

HashMap は、キーと値の対応関係を表すクラスです。
キーから値への関係性は一方向で、キーは重複させることが
出来ないようになっています。

```java:HashMapSample.java
import java.util.HashMap;

public class HashMapSample {

    public static void main(String args[]) {

        //HashMapデータを作成
        HashMap<String, String> hm = new HashMap<String, String>();
        hm.put("name", "Taro");
        hm.put("address", "Tokyo");
        hm.put("tel", "999-999-9999");

        //get メソッドでそれぞれのキーに紐づく値を取得
        System.out.println("name: " + hm.get("name"));
        System.out.println("tel: " + hm.get("tel"));
        System.out.println("aaa: " + hm.get("aaa"));
    }
}
```

出力結果

```
name: Taro
tel: 999-999-9999
aaa: null
null: null
```

## その他
他にも

1. Vector
2. Stack
3. HashTable

などがありますが、上から順にそれぞれ

1. ArrayList
2. LinkedList
3. HashMap

に代替され、使われる機会は少ないです。

## 参考

- [Java ちょこっとリファレンス - ArrayList](http://java-reference.sakuraweb.com/java_collection_arraylist.html)
- [Java ちょこっとリファレンス - LinkedList](http://java-reference.sakuraweb.com/java_collection_linkedlist.html)
- [Java ちょこっとリファレンス - HashSet](http://java-reference.sakuraweb.com/java_collection_hashset.html)
- [Java ちょこっとリファレンス - HashMap](http://java-reference.sakuraweb.com/java_collection_hashmap.html)