コレクション(リスト、セット、マップ、デック)は、オブジェクトの集合を扱うための仕組みです。
カテゴリ | クラス | 説明 |
---|---|---|
List系 | ArrayList | 配列を扱います。 |
LinkedList | 配列を扱います。挿入・削除が高速です。 | |
Vector | 配列を扱います。パフォーマンスが悪いため現在ではあまり推奨されない古いクラスです。 | |
Set系 | HashSet | 値の重複を許さない順不同の要素集合を扱います。 |
TreeSet | 値の重複を許さないソートされた要素集合を扱います。 | |
Map系 | HashMap | キーと値の組からなる要素の集合を扱います。 |
LinkedHashMap | キーと値の組からなる要素の集合を扱います。設定順序が保証されます。。 | |
TreeMap | キーと値の組からなる要素の集合を扱います。キーでソートされています。 | |
Queue系 | Deque | キューやスタックを扱います。 |
ArrayList は配列を扱う一般的なクラスです。ArrayList<String> は String 型のデータを要素として持つ ArrayList であることを示しています。
import java.util.*; class Main { public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>(); list.add("AAA"); list.add("BBB"); list.add("CCC"); for (String s : list) { System.out.println(s); } } }
Java 7 以降では右辺の型を省略することができるようになりました。<> はダイヤモンド演算子と呼ばれます。
ArrayList<String> list = new ArrayList<String>(); // Java 6 ArrayList<String> list = new ArrayList<>(); // Java 7
下記などのメソッドが用意されています。
コレクションをループ処理するには下記などの方法がありますが、後者の方が推奨されています。
// for-i ループで回す例 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } // for-each ループで回す例 for (String s : list) { System.out.println(s); }
LinkedList も ArrayList と同じように使用することができます。挿入や削除を頻繁に行う場合は ArrayList よりも LinkedList の方が高速です。ただし、get() による参照は ArrayList の方が高速です。
import java.util.*; class Main { public static void main(String[] args) { LinkedList<String> list = new LinkedList<>(); list.add("AAA"); list.add("BBB"); list.add("CCC"); for (String s : list) { System.out.println(s); } } }
Vector クラスも ArrayList や LinkedList と同じように扱うことができますが、同期をとるためパフォーマンスが悪く、現在ではあまり使用されていません。同期が必要な場合は ArrayList と java.util.Collections.synchronizedList() を組み合わせた方がよいそうです。
HashSet も配列の様に扱いますが、要素の重複が許されない、順序の保障が無い点が ArrayList や LinkedList と異なります。
import java.util.*; class Main { public static void main(String[] args) { HashSet<String> hash = new HashSet<>(); hash.add("AAA"); hash.add("BBB"); hash.add("CCC"); for (String s : hash) { System.out.println(s); } } }
下記などのメソッドが用意されています。
TreeSet も HashSet と同じように使用できます。要素が自動的にソートされる点が HashSet と異なります。
import java.util.*; class Main { public static void main(String[] args) { TreeSet<String> tree = new TreeSet<>(); tree.add("AAA"); tree.add("BBB"); tree.add("CCC"); System.out.println(tree); for (String s : tree) { System.out.println(s); } } }
HashMap は、キー(key)と値(value)の組み合わせを要素として持つ配列です。HashMap<String, Integer> はキーが String、値が Integer 型であることを示します。要素の追加には .put() を用います。キー名が重複する場合は上書きされます。順序は保証されません。
import java.util.*; class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("Yamada", 87); map.put("Tanaka", 92); map.put("Suzuki", 76); map.forEach((key, value) -> { System.out.println(key + ": " + value); }); } }
下記などのメソッドが用意されています。
LinkedHashMap は HashMap と同じように使用することができますが、値を設定した順番が保証される点が異なります。
import java.util.*; class Main { public static void main(String[] args) { LinkedHashMap<String, Integer> map = new LinkedHashMap<>(); map.put("Yamada", 87); map.put("Tanaka", 92); map.put("Suzuki", 76); map.forEach((key, value) -> { System.out.println(key + ": " + value); }); } }
TreeMap も HashMap と同じように使用できます。要素がキーによって自動的にソートされる点が HashMap と異なります。
import java.util.*; class Main { public static void main(String[] args) { TreeMap<String, Integer> map = new TreeMap<>(); map.put("Yamada", 87); map.put("Tanaka", 92); map.put("Suzuki", 76); map.forEach((key, value) -> { System.out.println(key + ": " + value); }); } }
Deque は double ended queue の略で、FIFO(First In First Out) のキューや、FILO(First In Last Out)のスタック両方の目的に使用できます。
import java.util.*; class Main { public static void main(String[] args) { Deque<String> queue = new ArrayDeque<>(); queue.addLast("AAA"); queue.addLast("BBB"); queue.addLast("CCC"); while (queue.size() > 0) { System.out.println(queue.pollFirst()); } } }
下記などのメソッドが用意されています。