コレクション(リスト、セット、マップ、デック)
- コレクション(リスト、セット、マップ、デック)
- アレイリスト(ArrayList)
- リンクドリスト(LinkedList)
- ベクトル(Vector)
- ハッシュセット(HashSet)
- ツリーセット(TreeSet)
- ハッシュマップ(HashMap)
- リンクドハッシュマップ(LinkedHashMap)
- ツリーマップ(TreeMap)
- デック(Deque)
コレクション(リスト、セット、マップ、デック)
コレクション(リスト、セット、マップ、デック)は、オブジェクトの集合を扱うための仕組みです。
カテゴリ | クラス | 説明 |
---|---|---|
List系 | ArrayList | 配列を扱います。 |
LinkedList | 配列を扱います。挿入・削除が高速です。 | |
Vector | 配列を扱います。パフォーマンスが悪いため現在ではあまり推奨されない古いクラスです。 | |
Set系 | HashSet | 値の重複を許さない順不同の要素集合を扱います。 |
TreeSet | 値の重複を許さないソートされた要素集合を扱います。 | |
Map系 | HashMap | キーと値の組からなる要素の集合を扱います。 |
LinkedHashMap | キーと値の組からなる要素の集合を扱います。設定順序が保証されます。。 | |
TreeMap | キーと値の組からなる要素の集合を扱います。キーでソートされています。 | |
Queue系 | Deque | キューやスタックを扱います。 |
アレイリスト(ArrayList)
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
下記などのメソッドが用意されています。
- list.add(o) - オブジェクト o を配列の末尾に追加する
- list.add(n, o) - オブジェクトを n で指定した場所に追加する
- list.get(n) - n番目の要素を得る
- list.remove(n) - n番目の要素を削除する
- list.set(n, o) - n番目の要素をオブジェクト o で置き換える
- list.size() - 要素の個数を得る
- list.isEmpty() - 空かどうか調べる
- list.indexOf(o) - オブジェクト o と等しい要素のインデックスを探す
- list.contains(o) - オブジェクト o と等しい要素があるか調べる
- list.addAll(list2) - 配列の末尾に配列 list2 を追加する
コレクションをループ処理するには下記などの方法がありますが、後者の方が推奨されています。
// 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)
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)
Vector クラスも ArrayList や LinkedList と同じように扱うことができますが、同期をとるためパフォーマンスが悪く、現在ではあまり使用されていません。同期が必要な場合は ArrayList と java.util.Collections.synchronizedList() を組み合わせた方がよいそうです。
ハッシュセット(HashSet)
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); } } }
下記などのメソッドが用意されています。
- set.add(o) - オブジェクト o を配列の末尾に追加する
- set.clear() - 配列をクリアする
- set.contains(o) - オブジェクト o と等しい要素があるか調べる
- set.isEmpty() - 空かどうか調べる
- set.remove(o) - オブジェクト o にマッチする要素を削除する
- set.size() - 要素の個数を得る
ツリーセット(TreeSet)
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)
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); }); } }
下記などのメソッドが用意されています。
- map.put(key, value) - key-value を設定する
- map.get(key) - key に対応する value を得る
- map.remove(key) - key の要素を削除する
- map.containsKey(key) - key の要素が存在するか否かを判別する
- map.clear() - すべての要素を削除する
- map.size() - 要素の個数を得る
- map.isEmpty() - 要素が空か否かを判別する
- map.forEach((key, value) -> function) - forEachループを回す
リンクドハッシュマップ(LinkedHashMap)
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)
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)
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()); } } }
下記などのメソッドが用意されています。
- queue.size() - 要素の個数を得る
- queue.addFirst(o) - oをデックの先頭に追加する(エラー時は例外を返す)
- queue.addLast(o) - oをデックの最後に追加する(エラー時は例外を返す)
- queue.offerFirst(o) - oをデックの先頭に追加する(エラー時はfalseを返す)
- queue.offerLast(o) - oをデックの最後に追加する(エラー時はfalseを返す)
- queue.removeFirst() - デックの先頭の値を取り出して削除する(エラー時は例外を返す)
- queue.removeLast() - デックの最後の値を取り出して削除する(エラー時は例外を返す)
- queue.pollFirst() - デックの最初の値を取り出して削除する(エラー時はnullを返す)
- queue.getFirst() - デックの最初の値を取り出す。削除しない(エラー時は例外を返す)
- queue.getLast() - デックの最後の値を取り出す。削除しない(エラー時は例外を返す)
- queue.peekFirst() - デックの最初の値を取り出す。削除しない(エラー時はnullを返す)
- queue.peekLast() - デックの最後の値を取り出す。削除しない(エラー時はnullを返す)
- queue.removeFirstOccurrence(o) - デックから最初に現れるoを削除する。見つからなければfalseを返す。
- queue.removeLastOccurrence(o) - デックから最後に現れるoを削除する。見つからなければfalseを返す。
- queue.add(o) - addLast(o)と同じ
- queue.push(o) - addFirst(o)と同じ
- queue.offer(o) - offerLast(o)と同じ
- queue.remove(o) - removeFirstOccurrence(o)と同じ
- queue.remove() - removeFirst()と同じ
- queue.pop() - removeFirst()と同じ
- queue.poll() - pollFirst()と同じ
- queue.element() - getFirst()と同じ
- queue.peek() - peekFirst()と同じ
- queue.contains(o) - デックにoが存在していればtrueを返す。
- queue.iterator() - ループするためのイテレータを返す。
- queue.descendingIterator() - 逆順でループするためのイテレータを返す。