Chapter 23

コレクション

KeitoYuasa
KeitoYuasa
2023.02.25に更新
このチャプターの目次
  • コレクション:複数のオブジェクトをまとめて管理するためのオブジェクトのこと。java.utilパッケージ内のCollection, Mapインターフェースで定義されている。
  • コレクションは、java.utilパッケージにあるので、importして使う必要がある。
  • エレメント:コレクションに格納する要素のこと。
  • コレクションの主なインターフェース以下の4つ
    • Collection:List, Set, Queueインターフェース
    • Map:SortedMapインターフェース
比較 配列 コレクション
要素の更新
要素数の増減 ×
使用するメモリ 少ない 多い
宣言・初期化 String[] array = new String[1]; List<String> list = new ArrayList<String>();
用途 要素数があらかじめ決まっている場合 要素数を自由に決めたい場合

※どちらも、宣言時に指定したものと同じデータ型の要素しか格納することができない。
※配列、コレクションは参照型なので、配列、コレクション自体の更新は行わず別の領域にそれぞれを生成する。

つまり、配列はあらかじめ取り扱う要素数を決めておく必要があり、後から要素数を増減することができない不便さがある一方、使用メモリを節約できる。

List

  • List:要素数が変更可能な配列のようなもの。
  • 要素の追加、削除が自由にできる。
  • 配列と同様に、要素の重複は問題ない。
  • Listインターフェースの代表的な実装クラスにとしてArrayListクラスがある。
Training.java
import java.util.ArrayList;

//実行クラス
class Training {
    public static void main(String[] args){
        //Listの宣言・初期化
        ArrayList<Integer> list = new ArrayList<>();
        Integer i1 = 1;
        int i2 = 2;
        Integer i3 = i1;
        
        list.add(i1); //要素の追加
        list.add(i2); //intをBoxingによりIntegerに変換
        list.add(i3); //重複要素
        list.add(3, 4); //index3に、4を追加

        System.out.println("list_size:" + list.size()); //配列と異なりsize()メソッドでListのサイズを取得

        for(int i = 0; i < list.size(); i++){
            System.out.print(list.get(i)); //要素の取得
            //System.out.println(list[i]); コンパイルエラー
        }
        System.out.println();
        //拡張for文も使用可
        for(Integer i : list){ System.out.print(i); }
    }
}
//出力結果:
//list_size:4
//1214
//1214
  • ArrayListオブジェクトのインスタンス化:ArrayList<Integer> list = new ArrayList<>();
    • <要素のデータ型>:<>内に格納する要素のデータ型を指定する。
  • ArrayList.add():リストに要素を追加
  • ArryaList.get():リストの要素を取得

Set

  • Set:要素数が変更可能で、要素の重複無し、順番はバラバラで要素を管理する。
  • 要素の追加、削除が自由にできる。
  • Setインターフェースを実装した実装クラス群のことを総称してセットと呼ぶ。
  • 代表的なセットとしてHashSetクラスがある。
Training.java
import java.util.HashSet;

//実行クラス
class Training {
    public static void main(String[] args){
        String[] array = {"A", "B", "C"}; //配列
        
        HashSet<String> Set = new HashSet<>(); //HashSet
        Set.add(array[0]); Set.add(array[1]); 
        Set.add(array[2]); Set.add(array[0]);
        
        System.out.println(Set.size());
        for(String s : Set){ System.out.print(s); }
    }
}
//出力結果:
//3
//ABC

Setは、重複した要素を格納しないので、Setのサイズは3になっている。
(厳密には、後から重複したデータを追加した場合、元のデータをそれに置き換えている。)

Map

  • Map:要素数が変更可能で、キーとそれに対応する値で要素を管理する。
  • キーは重複ダメ。値は重複しても問題ない。(キーが重複した場合は、最新のもので上書きする。)
  • indexで要素を管理するのではなく、キーで管理する。
  • 要素の追加、削除が自由にできる。
  • Mapインターフェースを実装した代表的な実装クラスとしてHashMapクラスがある。
Training.java
import java.util.*;

//実行クラス
class Training {
    public static void main(String[] args){
        HashMap<Integer, String> map = new HashMap<>();

        map.put(0, "A"); //キーと値を追加
        map.put(1, "B"); 
        map.put(2, "A"); 
        map.put(1, "C");
        
        //キーの出力
        for(int i = 0; i < map.size(); i++){
            System.out.print(map.get(i));
        }
        System.out.println();
        //キーの出力
        Set<Integer> keys = map.keySet();
        for(Integer key : keys){ System.out.print(key); }
        System.out.println();
        //値の出力
        Collection<String> values = map.values();
        for(String value : values){ System.out.print(value); }

    }
}
//出力結果:
//ACA
//012
//ACA

Mapのキーが重複したことにより、最新のキーとその値で要素が更新されていることがわかる。

ラムダ式

  • 定義:(引数) -> {処理;}
  • 一度しか利用しないクラスを簡単に実装できる。
  • 関数型インターフェースととセットで用いられる。
  • 引数が1つの場合は、()の省略ができる。
  • 処理が1分の場合、{}の省略ができる。また、{}を省略している場合は、returnも省略できる。
  • 事前に宣言している変数をラムダ式内で利用する場合、それはfinalとして扱われる。つまり、変更できない。