身近にあって、あまり深く考えずに使ってしまっている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);
