はじめに
コレクションとは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