【忘備録】Java : 目的別に見るListの処理の速さ

# はじめに
コレクションとは`ArrayList`や`LinkedList`等の複数の要素を格納することができる箱。
今回は下記2つのコレクションについて書いていく。参考書に答えは書いてあるが自分で試して体感しておきたいと思います。出来たら配列とも比較していく。
・`ArrayList`
・`LinkedList`

# 結論
追加は多少、`ArrayList`の方が速い。(`LinkedList`も十分速い)
取得は段違いに`ArrayList`の方が速い。
削除は段違いに`LinkedList`が速い。

取得は`LinkedList`がやけに時間が掛かってしまうので
取得を伴うリストを作る際は`ArrayList`で良いんじゃないでしょうか。

```
追加×取得 => `ArrayList`
追加×削除 => `LinkedList`
追加×取得×削除 => `ArrayList`
```

## 1, 要素の追加

```CompareList.java
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;

public class CompareList {
    public static void main(String[] args) {
        // arrayListの計測開始
        long arrayStart = System.currentTimeMillis();
        // 準備
        List<String> addArrayList = new ArrayList<String>();
        // 追加処理
        for (int num = 0; num<1000000; num++) {
            addArrayList.add("要素");
        }
        // arrayListの計測終了
        long arrayEnd = System.currentTimeMillis();
        System.out.println("arrayList(追加) : "+(arrayEnd - arrayStart)  + "ms");
        // 追加個数確認
        int arraylistSize = addArrayList.size();
        System.out.println(arraylistSize);

        // linkedListの計測開始
        long linkedStart = System.currentTimeMillis();
        // 準備
        List<String> addLinkedList = new LinkedList<String>();
        // 追加処理
        for (int num = 0; num<1000000; num++) {
            addLinkedList.add("要素");
        }
        // linkedListの計測終了
        long linkedEnd = System.currentTimeMillis();
        System.out.println("linkedList(追加) : "+(linkedEnd - linkedStart)  + "ms");
        // 追加個数確認
        int linkedListSize = addLinkedList.size();
        System.out.println(linkedListSize);
    }
}
```

```結果.java
        arrayList(追加) : 35ms
        1000000
        linkedList(追加) : 259ms
        1000000
```
## 2, 要素の削除

```CompareList.java

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

public class CompareList {
    public static void main(String[] args) {
        // 要素個数が30000のリストをそれぞれ準備
        String elem = "elem";
        List<String> array30000elems = new ArrayList<String>();
        List<String> linked30000elems = new LinkedList<String>();
        for(int i = 0; i<300000; i++){
            array30000elems.add(elem);
            linked30000elems.add(elem);
        }

        // arrayList計測開始
        long arrayStart = System.currentTimeMillis();
        int num = 0;
        // 削除処理
        while(array30000elems.size() > 0){
            num += 1;
            array30000elems.remove(elem);
        }
        System.out.println("処理回数 : "+num+"回");
        long arrayEnd = System.currentTimeMillis();
        System.out.println("arrayList(削除) : "+(arrayEnd - arrayStart)  + "ms");

        // linkedList計測開始
        long linkedStart = System.currentTimeMillis();
        int num2 = 0;
        // 削除処理
        while(linked30000elems.size() > 0){
            num2 += 1;
            linked30000elems.remove(elem);
        }
        System.out.println("処理回数 : "+num2+"回");
        long linkedEnd = System.currentTimeMillis();
        System.out.println("linkedList(削除) : "+(linkedEnd - linkedStart)+"ms");
    }
        
}
```

```結果.java
        処理回数 : 300000回
        arrayList(削除) : 5387ms
        処理回数 : 300000回
        linkedList(削除) : 16ms
```

## 3, 要素の取得

```CompareList.java
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;

public class CompareList {
    public static void main(String[] args) {
        // 要素個数が30000のリストをそれぞれ準備
        String elem = "elem";
        List<String> array30000elems = new ArrayList<String>();
        List<String> linked30000elems = new LinkedList<String>();
        for(int i = 0; i<300000; i++){
            array30000elems.add(elem);
            linked30000elems.add(elem);
        }

        // arrayList計測開始
        int count = 0;
        long arrayStart = System.currentTimeMillis();
        // 取得処理
        for(int i = 0; i < array30000elems.size(); i++){
            count += 1;
            array30000elems.get(i);
        }
        long arrayEnd = System.currentTimeMillis();
        System.out.println("arrayList(取得) : "+(arrayEnd - arrayStart)  + "ms");
        System.out.println("処理回数 : "+count+"回");

        // linkedList計測開始
        int count2 = 0;
        long linkedStart = System.currentTimeMillis();
        // 取得処理
        for(int i = 0; i < linked30000elems.size(); i++){
            count2 += 1;
            linked30000elems.get(i);
        }
        long linkedEnd = System.currentTimeMillis();
        System.out.println("linkedList(取得) : "+(linkedEnd - linkedStart)  + "ms");
        System.out.println("処理回数 : "+count2+"回");

    }
        
}
```

```結果.java
        arrayList(取得) : 7ms
        処理回数 : 300000回
        linkedList(取得) : 38475ms
        処理回数 : 300000回
```

## 4, 追加と削除の組み合わせ

```CompareList.java
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;

public class CompareList {
    public static void main(String[] args) {
        String elem = "elem";

        List<String> samplelist = new ArrayList<String>();
        long start1 = System.currentTimeMillis();
        for(int i =0; i < 30000; i++){
            samplelist.add(elem);
        }
        System.out.println("追加後 : "+samplelist.size());
        while(samplelist.size() > 0){
            samplelist.remove(elem);
        }
        long end1 = System.currentTimeMillis();
        System.out.println("arrayList(追加削除) : "+(end1 - start1)  + "ms");
        System.out.println("削除後 : "+samplelist.size());

        List<String> samplelist2 = new LinkedList<String>();
        long start2 = System.currentTimeMillis();
        for(int i =0; i < 30000; i++){
            samplelist2.add(elem);
        }
        System.out.println("追加後 : "+samplelist2.size());
        while(samplelist2.size() > 0){
            samplelist2.remove(elem);
        }
        long end2 = System.currentTimeMillis();
        System.out.println("linkedList(追加削除) : "+(end2 - start2)  + "ms");
        System.out.println("削除後 : "+samplelist2.size());
    }
        
}
```

```結果.java
        追加後 : 30000
        arrayList(追加削除) : 78ms
        削除後 : 0
        追加後 : 30000
        linkedList(追加削除) : 21ms
        削除後 : 0
```

## 5, 追加と取得と削除の組み合わせ

```CompareList.java
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;

public class CompareList {
    public static void main(String[] args) {
        String elem = "elem";

        // arrayList
        List<String> samplelist = new ArrayList<String>();
        long start1 = System.currentTimeMillis();

        // 300000個追加
        for(int i =0; i < 300000; i++){
            samplelist.add(elem);
        }
        System.out.println("追加後 : "+samplelist.size());

        // 300000個取得
        for(int i = 0; i < samplelist.size(); i++){
            samplelist.get(i);
        }
        // 追加取得に掛かった時間を出力
        long half1 = System.currentTimeMillis();
        System.out.println("arrayList(追加取得) : "+(half1 - start1)  + "ms");

        // 300000個削除
        while(samplelist.size() > 0){
            samplelist.remove(elem);
        }

        // 追加から削除まで掛かった時間を出力
        long end1 = System.currentTimeMillis();
        System.out.println("arrayList(追加取得削除) : "+(end1 - start1)  + "ms");
        System.out.println("削除後 : "+samplelist.size());


        // linkedList
        List<String> samplelist2 = new LinkedList<String>();
        long start2 = System.currentTimeMillis();

        // 300000個追加
        for(int i =0; i < 300000; i++){
            samplelist2.add(elem);
        }
        System.out.println("追加後 : "+samplelist2.size());

        // 300000個取得
        for(int i = 0; i < samplelist2.size(); i++){
            samplelist2.get(i);
        }

        // 追加取得に掛かった時間を出力
        long half2 = System.currentTimeMillis();
        System.out.println("linkedList(追加取得) : "+(half2 - start2)  + "ms");

        // 300000個削除
        while(samplelist2.size() > 0){
            samplelist2.remove(elem);
        }

        // 追加から削除まで掛かった時間を出力
        long end2 = System.currentTimeMillis();
        System.out.println("linkedList(追加取得削除) : "+(end2 - start2)  + "ms");
        System.out.println("削除後 : "+samplelist2.size());
    }
        
}
```

```結果.java
        追加後 : 300000
        arrayList(追加取得) : 34ms
        arrayList(追加取得削除) : 5152ms
        削除後 : 0
        追加後 : 300000
        linkedList(追加取得) : 37727ms
        linkedList(追加取得削除) : 37745ms
        削除後 : 0
```