4️⃣

コレクションとジェネリクス

2024/05/30に公開

概要

「Java SE 11 Programmer II (1Z0-816-JPN) 試験」の出題範囲「コレクションとジェネリクス」の自己学習メモになります

ラッパークラスとBoxing/Unboxing

ラッパークラス

基本データ型の値を参照型として扱う専用のクラスをラッパークラスと呼びます

Boxing/Unboxing

double d1 = 10; // OK 基本データ型暗黙の型変換
Double d2 = 10; // NG コンパイルエラー

Long lval1 = null;
long 1val2 = lval1; // NG NullPointerException

Long lval3 = null;
lval3++; // NG NullPointerException

Map<String, Long> map = new HashMap<>();
long lval4 = map.get("H10"); // NG NullPointerException

コレクション

コレクションの種類と特徴

各インタフェースの特徴

インタフェース名 説明
List データ項目に順序ずけをしたコレクション
Set ユニークな値のコレクションであり、順不同で要素を管理する
Queue FIFO形式のデータ入出力を行うコレクション
Map 個々のキーに対応する値をマッピングしたオブジェクトで、1つのキーには値が割り当てられる

Collectionインタフェースの主なメソッド

メソッド名 説明
boolean add(E e) 引数の要素をコレクションに追加する、この呼び出しの結果、コレクションが変更された場合は、trueを返す
void clear() このコレクションからすべての要素を削除する
boolean contains(Object obj) 指定された要素がこのコレクション内に存在する場合はtrueを返す
boolean containsAll(Collection<?> c) 指定されたコレクションが要素がすべてこのコレクションに含まれている場合はtrueを返す
boolean isEmpty() このコレクションに要素が1つも含まれていない場合はtrueを返す
boolean remove(Object obj) 引数に指定された要素を削除し、要素が削除された場合はtrueを返す
boolean removeAll(Collector<?> c) 引数に指定されたコレクションにあるすべての要素をこのコレクションから削除し、このメソッドの呼び出しの結果、このコレクションの内容に変化があった場合はtrueを返す
iterator<E> iterator() このコレクションの要素に対する反複子を返す
Object[] toArray() このコレクションの要素が全て格納されている配列を返す
T[] toArray(T[] array) このコレクションのすべての要素を含む配列を返す
int size() コレクション内の要素数を返す

Mapインターフェースの主なメソッド

メソッド名 説明
clear() マップ中のすべてのマッピングを削除する
boolean containsKey(Object obj) 指定されたキーに対応するキー値ペアがこのマップに存在する場合はtrueを返す
boolean containsValue(Object obj) 指定された値に対応するキー値ペアがこのマップに存在する場合はtrueを返す
V get(Object obj) 指定されたキーに対応する値を返す
boolean isEmpty() このマップ中にマッピングを保持していない場合はtrueを返す
V put(K key, V Value) 指定されたキー値ペアを格納する。指定されたキーに対してすでに値が割当られている場合は、新しい値で上書きされる
void putAll(Map<? extends K, extends V> m) 指定されたマップにあるすべてのキー値ペアをこのマップに格納する
V remove(Object obj) 指定されたキーに対応するキー値ペアが存在する場合、それを削除する。戻り値をしては、指定キーに割り当てられていた値を返し、値が存在しない場合はnullを返す
int size() このマップ中に存在するキー値ペアの数を返す
Collection <V> values() このマップ中の値をコレクションとして返す

List、Set、Queue、Mapの利用

List

クラス名 説明
ArrayList サイズ変更可能な配列。ランダムアクセスは高速だが、挿入と削除は低速である。同期性はサポートしていない
LinkedList 挿入と削除がArrayListより高速である。同期性はサポートしていない
Vetor ArrayListと同様だが、同期性をサポートしている

Set

クラス名 説明
HashSet データ項目へのアクセスはTreeSetよりも高速であるが、データ項目を順序ずけることはできない。同期性をサポートしていない
TreeSet SortedSertインターフェースの実装クラスである。ソートされたデータ項目を得られるが、アクセス速度はHashSetよりも低速である。同期性をサポートしていない
LinkedHashSet HashSetと同等の機能に加えて、すべてのデータ項目に対する二重リンクリストを追加したものである。同期性をサポートしていない

イテレーターの利用

イテレーターオブジェクトの取得用メソッド

メソッド名 説明
iterator<E> iterator() このコレクションの要素に対する反復子を返す

Iteratorインターフェースのメソッド

メソッド名 説明
boolean hasNext() 次の要素がある場合はtrueを返す
E next() 次の要素を返す
default void remove() next()の呼び出しごとに1回だけ呼び出すことができ、イテレータによって最後に返された要素を削除する

Queue

Queueインターフェースの主なメソッド

操作 メソッド名 説明
挿入 boolean add(E e) 要素が追加された場合はtrue、要素が追加できない場合はllegalStateException
挿入 boolean offer(E e) 要素が追加された場合はtrue、それ以外の場合はfalse
削除 E remove() キューの先頭を取得および削除する。このキューが空の場合はNotSuchElementExceptionをスロー
削除 E poll() キューの先頭を取得および削除する。このキューが空の場合はnull
検査 E element() キューの先頭を取得するが削除しない。このキューが空の場合はNotSuchElementExceptionをスロー
検査 E peek() キューの先頭を取得するが削除しない。このキューが空の場合はnull

Dequeインターフェースの主なメソッド

操作 メソッド名 説明
挿入(例外スロー) void addFirst(E e) 指定された要素を先頭に挿入する
挿入(特殊な値) boolean offerFirst(E e) 指定された要素を先頭に挿入する
挿入(例外スロー) void addLast(E e) 指定された要素を末尾に挿入する
挿入(特殊な値) boolean offerLast(E e) 指定された要素を末尾に挿入する
削除(例外スロー) E removeFirst() キューの先頭を削除する
削除(特殊な値) E pollFirst() キューの先頭を削除する
削除(例外スロー) E removeLast() キューの末尾を削除する
削除(特殊な値) E pollLast() キューの末尾を削除する
検査(例外スロー) E elementFirst() キューの先頭を取得するが削除しない
検査(特殊な値) E peekFirst() キューの先頭を取得するが削除しない
検査(例外スロー) E elementLast() キューの末尾を取得するが削除しない
検査(特殊な値) E peekLast() キューの末尾を取得するが削除しない

スタックメソッドとDequeメソッドの比較

スタックメソッド Dequeメソッド
void push(E e) void addFirst(E e)
E pop() E removeFirst()
E peek() E getFirst()

Map

Mapインターフェースの主な実装クラス

クラス名 説明
hashMap マップ内に各々のキーと値をペアは順不同で格納される。また、nullをキーあるいは値として使用できる。同期性はサポートしていない
LinkedHashMap すべてのエントリに対する二重リンクリストを保持するという点でHashMapと異なっている。同期性はサポートしていない
TreeMap キー昇順による順序ずけが維持される。同期性はサポートしていない

従来型とジェネリクス型

ジェネリクスとは

クラス定義などで汎用的に型を示しておき、利用時に目的のオブジェクトの型を当てはめられます

従来型のサンプルコード

ArrayList list = new ArrayList();
Integer val1 = 1;
int val2 = 2;
Integer val3 = val1;

list.add(val1);
list.add(val2);
list.add(val3);
// list.add("ABC");

System.out.println("size : " + list.size());

for (int = 0; i < list.size(); i++) {
    // Integer obj = list.get(i); // NG
    Integer obj = (Integer)list.get(i); // OK
    System.out.println(obj + " ");
}

ジェネリクス対応のコレクションの場合

コレクション生成する際に、格納する要素のデータ型を指定する

ArrayList<String> list = new ArrayList<String>(); // OK

ArrayList<Object> list = new ArrayList<String>(); // NG

ArrayList<String> list = new ArrayList<Object>(); // NG

ダイヤモンド演算子

ArrayList<String> list = new ArrayList<String>(); // OK

ArrayList<String> list = new ArrayList<>(); // OK

ジェネリクスを用いた独自クラスの定義

  • クラス定義およびインターフェース定義で使用
  • メソッド定義で使用
  • コンストラクタ定義で使用
class クラス名 <型パラメータリスト> {
    private 型パラメータ 変数名; // インスタンス変数
    public コンストラクタ名(型パラメータ 引数名) { } // コンストラクタ
    public 型パラメータ メソッド名(型パラメータ 引数名) // メソッド
}

ジェネリクスを用いたメソッド定義

構文

[修飾子] <型パラメータリスト> 戻り値の型 メソッド名(データ型 引数) { }

ジェネリクスを用いたインターフェース宣言

継承を使用したジェネリクス

構文

<型パラメータ extends データ型>

ワイルドカードを使用したジェネリクス

構文

<? extends タイプ>

extendsキーワードを指定しているため、タイプに指定したデータ型やそのサブクラス(またはそのサブインターフェース)に対応する

<? super タイプ>

superキーワードを指定しているため、タイプに指定したデータ型やそのスーパークラス(またはそのスーパーインターフェース)に対応する

オブジェクトの順序付け

ComparableインターフェースとComparatorインターフェース

Comparableインターフェースの利用

構文

public int comparaTo(T o)

比較ルール

操作 戻り値 説明
自オブジェクト == 比較対象オブジェクト 0 自オブジェクトが保持する値と比較対象オブジェクトの値が同じ
自オブジェクト < 比較対象オブジェクト 負の数 自オブジェクトが保持する値が、比較対象オブジェクトより小さい
自オブジェクト > 比較対象オブジェクト 正の数 自オブジェクトが保持する値が、比較対象オブジェクトより大きい

Comparatorインターフェースの利用

構文

public int compara(T o1, T o2)

クラス名 説明
static <T extends Comparable<? super T>> Comparator<T> naturalOrder() 自然順序で比較するとComparatorを返す。nullを比較した場合はNullPointExceptionをスロー
static <T extends Comparable<? super T>> Comparator<T> reverseOrder() 自然順序の逆で比較するComparatorを返す。nullを比較した場合はNullPointExceptionをスロー
static <T extends Comparable<T> nullFirst(Comparator<? super T>) comparator nullを含む比較を行うComparatorを返す。nullは先頭になる
static <T extends Comparable<T> nullLast(Comparator<? super T>) comparator nullを含む比較を行うComparatorを返す。nullは末尾になる
default Comparator<T> reversed() このComparatorの逆順を義務付けるComparatorを返す

コレクションが提供する便利なメソッド

Collectionsクラスの主なメソッド

クラス名 説明
static <T extends Comparable<? super T>> void sort(List<T> list) 要素の「自然順序ずけ」 に従って、指定されたリストを昇順にソートする
static <T> void sort(List<T> list,Comparator<? super T> c) 指定されたコンパレータが示す順序に従って、指定されたリストをソートする。なお、第二引数にnullが指定されると自然順序になる
static void reverse(List<?> list) 指定されたリストの要素の順序を逆にする

Arraysクラス

Arraysクラスの主なメソッド

クラス名 説明
static <T> List<T> asList(T ...a) 引数で指定された配列をもとにリストを作成する
static void sort(Object[] a) 要素の自然順序ずけに従って、指定されたオブジェクトの配列を昇順でソートする。すべての要素は、Comparableインターフェースを実装している必要がある
static <T> void sort(T[] a, Comparator<? super T> c) 指定されたコンパレータが示す順序に従って、指定されたオブジェクトの配列をソートする。なお、第二引数にnullが指定されると自然順序になる

ファクトリメソッド

  • 変更不可能であるため、要素を追加、削除、置換することはできない
  • セットとリストはnull要素を使用できない。
  • マップは、キーと値ともにnull要素を使用できない。
  • セットの場合、重複すう値は使用できない
  • マップの場合、重複するキーは使用できない

Discussion