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