[Java] Collectionクラスまとめ ~List, Set, Mapの実装と使い方~


## 要約
Collectionクラスには主に３つのインターフェイスが用意されています。

* **[List](#list)** : 順番通りに格納 (ex. [ArrayList](#arraylist), [LinkedList](#linkedlist))
* **[Set](#set)** : バラバラに格納 (ex. [HashSet](#hashset), [TreeSet](#treeset))
* **[Map](#map)** :Keyに対応づけて格納 (ex. [HashMap](#hashmap), [TreeMap](#treemap))

## List

Listは**インターフェース**と呼ばれる抽象メソッドのみをもったものです。
Listはあくまでもインタフェースであるため、インスタンスの生成ができません。

よって、以下のようには書けません。
```Java
//間違い
List<Integer> list = new List<Integer>();
```
Listインターフェイスを実装したクラスは[ArrayList](#arraylist), [LinkedList](#linkedlist), Stackなどがあります。


### ArrayList

ArrayListはListインタフェースを実装したコレクションクラスです。

```Java
//初期化
List<Integer> al = new ArrayList<Integer>();

//n番目の要素を取得
al.get(n);

//n番目に"value"を追加
al.add(n, "value");

//n番目の要素を"hoge"に置き換える
al.set(n,"hoge");

//n番目の要素を削除する
al.remove(n);

//リストの要素に"hoge"があるかどうかを判定する
al.contains("hoge");

//リストの要素数がゼロであるかどうかを判定する(bool)
al.isEmpty();

//リストの要素数を取得する
al.size();

//全削除
al.clear();
```
上記のように使用します。


### LinkedList
LinkedListもListインタフェースを実装したコレクションクラスです。
```Java
//初期化
List<Integer> ll = new LinkedList<Integer>();

//n番目の要素を取得
ll.get(n);

//n番目に"value"を追加
ll.add(n, "value");

//n番目の要素を"hoge"に置き換える
ll.set(n,"hoge");

//n番目の要素を削除する
ll.remove(n);

//リストの要素に"hoge"があるかどうかを判定する
ll.contains("hoge");

//リストの要素数がゼロであるかどうかを判定する(bool)
ll.isEmpty();

//リストの要素数を取得する
ll.size();

//全削除
ll.clear();
```

上記のように使用します。


### ArrayList vs LinkedList

ArrayListとLinkedListの違いは下記の表の通りです。

|ArrayList| |LinkedList|
|:-------:|:---:|:---:|
|速い|**検索**|遅い|
|遅い|**挿入・削除**|速い|



参考:@BumpeiShimadaさんの [LinkedList と ArrayList の使い分け方](https://qiita.com/BumpeiShimada/items/522798a380dc26c50a50)


## Set
:::note warn
Setは重複を許しません
:::
Setは**インターフェース**という抽象的なものです。
Setはあくまでもインタフェースであるため、インスタンスの生成ができません。

よって、以下のようには書けません。
```Java
//間違い
Set<Integer> set = new Set<Integer>();
```

Setインターフェイスを実装したクラスには [HashSet](#hashset), [TreeSet](#treeset)があります。


### HashSet
HashSetはSetインタフェースを実装したコレクションクラスです。

```Java
//初期化
Set<String> hs = new HashSet<String>();

//要素追加
hs.add("hoge");

//要素削除
hs.remove("hoge");

//全要素削除
hs.clear();
```
上記のように使用します。

### TreeSet
TreeSetもSetインタフェースを実装したコレクションクラスです。

```Java
//初期化
Set<String> ts = new TreeSet<String>();

//要素追加
ts.add("hoge");

//要素削除
ts.remove("hoge");

//全要素削除
ts.clear();
```
上記のように使用します。

### HashSet vs TreeSet

HashSetとTreeSetの違いは下記の表の通りです。

|HashSet| |TreeSet|
|:-------:|:---:|:---:|
|格納可|**null**|格納不可|
|しない|**ソート**|自動でする|



## Map
:::note warn
Mapはキーの重複を許しません。キーが同じ場合、上書きされます。
:::
Mapは**インターフェース**という抽象的なものです。
Mapはあくまでもインタフェースであるため、インスタンスの生成ができません。

よって、以下のようには書けません。
```Java
//間違い
Map<String, String> map = new Map<String, String>();
```

Mapインターフェイスを実装したクラスには [HashMap](#hashmap), [TreeMap](#treemap)があります。


### HashMap
HashMapはMapインタフェースを実装したコレクションクラスです。

```Java
//初期化
Map<String, String> hm = new HashMap<String, String>();

//検索
hm.get("Key1"); //なければnullが返る

//要素追加(キー、値)
hm.put("Key2", "value2");

//要素削除
hm.remove("Key3"); 

```
上記のように使用します。

### TreeMap
TreeMapもMapインタフェースを実装したコレクションクラスです。

```Java
//初期化
Map<String> ts = new TreeMap<String>();

//検索
ts.get("Key1"); //なければnullが返る

//要素追加(キー、値)
ts.put("Key2", "value2");

//要素削除
ts.remove("Key3"); 
```
上記のように使用します。

### HashMap vs TreeMap

HashMapとTreeMapの違いは下記の表の通りです。

|HashMap| |TreeMap|
|:-------:|:---:|:---:|
|格納可|**null**|格納不可|
|しない|**ソート**|自動でする|

---
参考になれば幸いです！
いいねをお待ちしてます！

## 参考
* [Javaちょこっとリファレンス](https://java-reference.com/java_collection_compare.html#:~:text=Set%E6%A7%8B%E9%80%A0%E3%81%AF%E3%80%81%E8%A6%81%E7%B4%A0%E3%82%92,%E6%A7%8B%E6%96%87%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)
* [LinkedList と ArrayList の使い分け方](https://qiita.com/BumpeiShimada/items/522798a380dc26c50a50)