Java基礎ーCollectionとMap

CollectionとMap

1. List

順番を保持した動的配列で、以下の特徴がある。

  • 格納した順番も保持される
  • インデックス番号を指定して特定のデータを取得することが出来る
  • データの重複が可能

1.1 Listの種類

クラス名 説明
ArrayList 要素へのアクセススピードが速い。
要素の追加・削除は遅い。
LinkedList 要素へのアクセススピードが遅い。
要素の追加・削除は速い。

1.2 主なメソッド

メソッドの引数や戻り値にあるEは総称型といい、Listに格納できるデータの型を指定しているもので、Listの宣言時に指定する。

メソッド名 説明
boolean add(E e) Listの最後尾に新しい要素を追加する。
E get(int index) 引数に指定したインデックス番号の要素を取り出す。
int size() Listに格納されている要素の数を返す。
boolean isEmpty() Listが空かどうか確認する。
Listの要素数が0の場合true, 0でない場合falseを返す。
void clear() Listの要素を全て削除する。
public class Sample {
    public void listSample(){
        List<String> list = new ArrayList<>();
        list.add("りんご");
        list.add("ぶどう");
        list.add("ばなな");
        list.add("ぶどう");

        list.isEmpty(); // false
        list.size(); // 4
        String s = list.get(0); // りんご
        String s = list.get(1); // ぶどう
        String s = list.get(2); // ばなな
        String s = list.get(3); // ぶどう
        list.clear();
        list.isEmpty(); // true
        list.size(); // 0
    }
}

1.3 変更不可List

String型の変数の場合、以下のように記述することで変数の値を変更することができなくなる。

final Stirng moji = "あいうえお";

同じような記述をListで書いた場合、別のListを代入することはできないが、今変数に代入されているListに対して値を追加することはできてしまう。

List<String> list = new ArrayList<>();
list.add("りんご");
final List<String> myList = list;

// これはできない
myList = new new ArrayList<String>();

// これはできる
myList.add("ごりら");

Listに格納されている値の数や内容を変更されたくない場合はunmodifiableListとする必要がある。

List<String> list = new ArrayList<>();
list.add("りんご");
List<String> myList = Collections.unmodifiableList(list);

// List#ofメソッドで作成したリストもunmodifiableListとなる
List<String> myList = List.of("りんご");

同様のことは後述のSet, Mapにも言える。


2. Set

以下の特徴がある。

  • 格納した順番は保持しない
  • データの重複が出来ない

2.1 Setの種類

クラス名 説明
HashSet 要素の順番を保持しない。
データの重複は出来ない。
LinkedHashSet 要素の順番を保持する。
データの重複は出来ない。
TreeSet 要素の順番はソートされる。
データの重複は出来ない。

2.2 主なメソッド

メソッドの引数や戻り値にあるEは総称型といい、Setに格納できるデータの型を指定しているもので、Setの宣言時に指定する。

メソッド名 説明
boolean add(E e) Setに新しい要素を追加する。
追加しようとしたデータがまだ存在していなかった場合trueを返す。
int size() Setに格納されている要素の数を返す。
boolean isEmpty() Setが空かどうか確認する。
Setの要素数が0の場合true, 0でない場合falseを返す。
void clear() Setの要素を全て削除する。
public class Sample {
    public void setSample(){
        Set<String> set = new HashSet<>();
        set.add("りんご");
        set.add("ぶどう");
        set.add("ばなな");

        set.isEmpty(); // false
        set.size(); // 3
        for(String s : set) {
            System.out.println(s); // 順番は保持していないので出てくる順番はランダムとなる
        }
        set.clear();
        set.isEmpty(); // true
        set.size(); // 0
    }
}

2.3 変更不可Set

Collections#unmodifiableSetメソッドを使用して既存のSetを変更不可Setにするか、 Set#ofメソッドで最初から変更不可Setを作成する。

Set<String> set = new HashSet<>();
set.add("りんご");
Set<String> mySet = Collections.unmodifiableSet(set);

// Set#ofメソッドで作成したリストもunmodifiableSetとなる
Set<String> mySet = Set.of("りんご");

3. Map

別名、ハッシュテーブル、連想配列、ハッシュマップと呼ばれる
データをkey-valueで対応付けている
以下の特徴を持つ

  • 格納した順番は保持しない
  • キーの重複が出来ない⇒同じkeyのデータを追加しようとした場合は上書きされる

3.1 Mapの種類

クラス名 説明
HashMap 要素の順番を保持しない。
データの重複は出来ない。
LinkedHashMap 要素の順番を保持する。
データの重複は出来ない。
TreeMap 要素の順番はキーでソートされる。
データの重複は出来ない。

3.2 主なメソッド

メソッドの引数や戻り値にあるK, Vは総称型といい、Mapに格納できるデータの型を指定しているもので、Mapの宣言時に指定する。

メソッド名 説明
V put(K k, V v) Mapに新しい要素を追加する。
追加したValueが返される。
V get(Object key) 引数にキーに対応するValueを取り出す。
対応するものがない場合はnullを返す。
int size() Mapに格納されている要素の数を返す。
boolean isEmpty() Mapが空かどうか確認する。
Mapの要素数が0の場合true, 0でない場合falseを返す。
Set<K> keySet() KeyのSetを返す。
Collection<V> values() ValueのCollectionを返す。
Set<Map.Entry<K, V>> entrySet() Mapに格納されているデータ(Entry)のSetを返す。
void clear() Mapの要素を全て削除する。
Map<String, String> map = new HashMap<>();
map.put("001", "花子");
map.put("002", "次郎");
map.put("003", "三郎");

map.isEmpty(); // false
map.size(); // 3
String name = map.get("001"); // 花子
String name = map.get("002"); // 次郎
String name = map.get("003"); // 三郎
String name = map.get("004"); // null

for(String key : map.keySet()) {
    System.out.println(key); // 順番は保持していないので出てくる順番はランダムとなる
}

for (Map.Entry<String, String> e : map.entrySet()) {
    System.out.println(e.getKey() + ":" + e.getValue());
}

map.clear();
map.isEmpty(); // true
map.size(); // 0

3.3 変更不可Map

Collections#unmodifiableMapメソッドを使用して既存のMapを変更不可Mapにするか、 Map#ofメソッドで最初から変更不可Mapを作成する。

Map<String, String> map = new HashMap<>();
map.put("apple", "りんご");
Map<String, String> myMap = Collections.unmodifiableMap(map);

// Map#ofメソッドで作成したリストもunmodifiableMapとなる
Map<String, String> myMap = Map.of("apple", "りんご");