JavaのCollectionに関する備忘録

Pocket

身近にあって、あまり深く考えずに使ってしまっているCollection系のクラス。
案外、「ArrayListだけしか使っていない、それ以外は知らない」という人も多いような気もします。
Setなんて、知名度がかなり低い気もします。でも実は、Setを使うべきシーンは多い気もします。
斯く言う私も怪しいので、ここにまとめておきます。

List系

重複を許可し、順序を保持します。
重要な実装クラスとしてArrayListとLinkedListがあります。
どういった操作を主に行うかによって使い分けます。

追加、削除 要素番号を指定してのアクセス
(ランダムアクセス)
iteratorで回す
(シーケンシャルアクセス)
一番速い回し方
ArrayList 遅い 速い 遅い
for (int i = 0; i < list.size(); i++) {
	型 value = list.get(i);
}
LinkedList 速い 遅い 速い
for (Iterator<String> i = list.iterator(); i.hasNext();) {
	String value = i.next();
}
for (String value : list) {
}

■Listを配列に変換したい場合

List<String> list = new ArrayList();
list.add("a");
list.add("b");
String[] array = list.toArray(new String[list.size()]);

■配列を不変のListに変換したい場合

String[] array = {"a", "b"};
List<String> list = Arrays.asList(array);

■Listに複数の要素を追加したい場合

List<String> list = new ArrayList<>();
Collections.addAll(list, "a", "b", "c", …);

■要素が0の内容が不変のListがほしい場合

List<String> list = Collections.emptyList();

■要素が1の内容が不変のListがほしい場合

List<String> list = Collections.singletonList("str");

■要素が複数で内容が不変のListがほしい場合

List<String> unmodifiableList = Collections.unmodifiableList(list);

Set系

重複しない値を保持します。
重要な実装クラスとしてHashSet、LinkedHashSet、TreeSetがあります。
こっちはListと違ってそれぞれ振る舞いが違うので用途で使い分けです。

HashSet 基本となるSet。最も速い。
LinkedHashSet 追加した順序が保持される。重複する値を持たないListみたいなもの。
TreeSet 格納されている値が常にソートされる。任意の条件でソートしたい場合はコンストラクタでComparatorを指定する。

■Setを配列に変換したい場合

Set<String> set= new HashSet<>();
set.add("a");
set.add("b");
String[] array = set.toArray(new String[set.size()]);

■Setに複数の要素を追加したい場合

Set<String> set = new HashSet<>();
Collections.addAll(set, "a", "b", "c", …);

■要素が0の内容が不変のSetがほしい場合

Set<String> set = Collections.emptySet();

■要素が1の内容が不変のSetがほしい場合

Set<String> set = Collections.singleton("str");

■要素が複数で内容が不変のSetがほしい場合

Set<String> unmodifiableSet = Collections.unmodifiableSet(set);
Set<String> unmodifiableSortedSet = Collections.unmodifiableSortedSet(sortedSet);
Pocket

コメントを残す

メールアドレスが公開されることはありません。