こんにちは!しーま(@s59shima)です。
いつもブログをご覧いただきありがとうございます。
今回は、こんな悩みや疑問のある方に向けて記事を書きました。

List/Set/Map は配列のように複数の値を保持できるのは分かったけど、実際にどうやって使用するの!?
ListやMapについて存在は知っているけど、「違い」や「使い方」について知りたい方に おすすめです。
クラス図 – List Set Map –
まずは、クラス図を見ていきましょう!
List / SetインターフェースはCollectionクラスを継承していることがわかりますね。
Mapはキーと値が対になったオブジェクトであるため、List / Setとは異なることがわかります。

List/Set/Mapの活用方法
List/Set/Mapは、たくさんのデータを1つのオブジェクトとして操作することができ、データを取り出したり、追加したりすることが可能です。
配列とは異なり、最初からサイズを決める必要がありません。
配列と同じように複数データを扱えるListやキーと値の対になってるMapなど、用途に合わせて使い分けていきましょう!
Listの活用方法

- 要素の順番を保証します。
- 重複要素を許可します。
List – 実装クラス –
Listインターフェースを実装したクラスに【ArrayList】【LinkedList】が存在します。
ArrayList | 検索は早い。要素の追加・削除は遅い。 |
LinkedList | 検索は遅い。要素の追加・削除は早い。 |
List – 初期化 –

点線枠で囲んだ部分(前と後ろのデータ型)は同じにする必要がありますので、気を付けてくださいね。下記、サンプルのソースコードになります。
package app.collection;
import java.util.ArrayList;
import java.util.LinkedList;
public class App {
public static void main(String[] args) {
// 初期化の方法
ArrayList<String> arraylist = new ArrayList<String>();
LinkedList<String> linkedlist = new LinkedList<String>();
}
}
List – 要素追加 –
要素の追加は addメソッドを使用します。
// 初期化の方法
ArrayList<String> arraylist = new ArrayList<String>();
LinkedList<String> linkedlist = new LinkedList<String>();
// ArrayListでの追加
arraylist.add("A");
arraylist.add("B");
arraylist.add("C");
System.out.println( "ArrayList" + arraylist );
// LinkedListでの追加
linkedlist.add("A");
linkedlist.add("B");
linkedlist.add("C");
System.out.println( "LinkedList" + linkedlist );
ArrayList, LinkedList のどちらもaddメソッドで追加できます。実行結果は下記のようになります。
ArrayList[A, B, C]
LinkedList[A, B, C]
また、要素の順番を指定して、追加することも可能です。
// 初期化の方法
ArrayList<String> arraylist = new ArrayList<String>();
LinkedList<String> linkedlist = new LinkedList<String>();
// ArrayListでの追加
arraylist.add("A");
arraylist.add("B");
// 追加場所を指定
arraylist.add(1, "C");
System.out.println( "ArrayList" + arraylist );
// LinkedListでの追加
linkedlist.add("A");
linkedlist.add("B");
// 追加場所を指定
linkedlist.add(1, "C");
System.out.println( "LinkedList" + linkedlist );
実行結果は下記のようになります。 要素【C】が【A】と【B】の間になりましたね。
ArrayList[A, C, B]
LinkedList[A, C, B]
Listについてもう少し詳しく知りたい方は下記の記事も合わせてどうぞ。
おまけ
ここで実験をしてみたいと思います。
【ArrayList】【LinkedList】の取得処理について計測してみます。どのくらい速度差があるか確認していきましょう!
10万個の要素を持つ【ArrayList】【LinkedList】を1つずつ取得(検索)した場合、実行時間はどのくらい差があるのでしょうか!
package test;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class Sample {
public static void main( String args[] ) {
int count = 100000;
long startTime = 0;
long endTime = 0;
List<Integer> arraylist = new ArrayList<Integer>();
List<Integer> linkedlist = new LinkedList<Integer>();
// 要素の追加
for ( int i = 0; i < count; i++ ) {
arraylist.add(i);
linkedlist.add(i);
}
// ArrayListの測定
startTime = System.currentTimeMillis();
for ( int i = 0; i < count; i++ ) {
arraylist.get(i);
}
endTime = System.currentTimeMillis();
System.out.println( "ArrayList 取得:" + (endTime - startTime) + "ミリ秒");
// LinkedListの測定
startTime = System.currentTimeMillis();
for ( int i = 0; i < count; i++ ) {
linkedlist.get(i);
}
endTime = System.currentTimeMillis();
System.out.println( "LinkedList 取得:" + (endTime - startTime) + "ミリ秒" );
}
}
このソースコードの実行結果はこちらです。
ArrayList 取得:1ミリ秒
LinkedList 取得:4045ミリ秒
ArrayListは約1ミリ秒に対して、LinkedListは4秒の処理時間になります。
かなりの速度差があることがわかります。
Setの活用方法

- 重複要素は許可しない。
Set – 実装クラス –
Setインターフェースを実装したクラスに【HashSet】【TreeSet】が存在します。
HashSet | 要素の順番は保証しない。 |
TreeSet | 要素の順番はソートされる。 |
Set – 初期化 –
import java.util.HashSet;
import java.util.TreeSet;
HashSet<String> hashset = new HashSet<String>();
TreeSet<String> treeset = new TreeSet<String>();
Set – 要素追加 –
要素の追加は addメソッドを使用します。
treeset.add("C");
treeset.add("A");
treeset.add("B");
実行結果は A,B,C となります。TreeSetの場合、ソートされて出力されていることが分かります。
Mapの活用方法

- キーと値が対になった要素
- キーの重複は許可しない。
Map – 実装クラス –
Mapインターフェースを実装したクラスに【HashMap】【TreeMap】が存在します。
HashMap | キーの順番は保証しない。 |
TreeMap | キーの順番はソートされる。 |
Map – 初期化 –
import java.util.HashMap;
import java.util.TreeMap;
HashMap<Integer, String> hashmap = new HashMap<Integer, String>();
TreeMap<Integer, String> treemap = new TreeMap<Integer, String>();
Map – 要素追加 –
要素の追加は putメソッドを使用します。
treemap.put(3, "C");
treemap.put(1, "A");
treemap.put(2, "B");
実行結果は 1=A, 2=B, 3=C となります。TreeMapの場合、keyがソートされて出力されていることが分かります。
Mapについてもう少し詳しく知りたい方は下記の記事も合わせてどうぞ。
まとめ
最後まで読んでいただきありがとうございます。
Java開発においてList/Set/Mapを扱う頻度はかなり高いと思います。処理内容や用途に応じて使い分けることが出来れば無駄のないソースコードが書けるようになると思います!
Mid Works
は業界トップクラスの低マージンで多くのエンジニアから選ばれています!! IT系フリーランス専門エージェントサービス第1位の Mid Works
の無料会員登録はこちらから!!