プログラミング

【Java初心者向け】List、Setなどコレクションの種類と利用方法を抑えよう(Map、Queueなども紹介)

プログラミング
この記事は約6分で読めます。
Sponsored Links

コレクションとは?

イチゴ, 甘い, 赤, おいしい, 熟した, フルーティー, フルーツ, ビタミン, 健康

コレクションとは多くの要素を1つのオブジェクトとして扱うために利用され、「コレクションインターフェース」を実装したクラスのことを指します。ListやSetなどがこれに該当します。コレクションと似た要素として、Mapもありますが、Mapはコレクションではありません。

コレクションの種類

おもちゃの車, お土産, バス, おもちゃ, 赤, 錫車, 黄色, 金属, 装飾, ギフト, 装飾的な, 色

コレクションには数多くの種類があります。ここでは、コレクションのList、Setについて紹介していきます。

List

Listは入力された値に対して自動的にインデックス(順序)がつきます。自由に要素の出し入れをしたい場合に使用します。リストへ様々な操作をするためには下記のようなメソッドを利用します。特に、addなどをした場合は自動的に最後尾にデータが追加され、インデックス番号も自動追加されます。

List list = new ArrayList();

//リストに値を追加
list.add(1);

//リストにリストを追加
list1.addAll(list2);

//リストの値を変更
list.set(0, 3);

//リストの値を取得
list.get(0);

//リストの要素数を取得
list.size();

//リストから値の要素番号を取得
list.indexOf("a");

//リストから範囲を指定してコピー
list.subList(1, 3);

//リストに値が含まれるか判定
list.contains("a");

//リストから指定する要素番号の値を削除(合致するものが複数ある場合は最初のものを削除dxf)
list.remove(1);

//リストで重複する値を削除
list.stream().distinct();

//リストのコピー
list.clone();

Listの実装クラスとしては、ArrayListとLinkedListがあります。ArrayListは検索などがある際に高速で動き、LinkedListは挿入削除の数が多い際に高速で動きます。使うデータに合わせてインスタンス生成をするようにしましょう。

Set

SetはListに非常に似たコレクションです。Listとの違いは同じ値を持つことができるかどうかで、Listは値の重複を許すのに対し、Setでは値の重複をすることができません。またインデックスが自動挿入されないため、要素の格納順番は保証されておらず、インデックスによる要素の取り出しなどはできません。Setの実装クラスとしては、HashSet、TreeSet、LinkedHashSetの3つがあります。

HashSetは最も高速で動き、TreeSetは自動ソート機能があります。LinkedHashSetはデータを格納順で取り出したい場合に使用します。

コレクション以外で集団を扱う

ランプ, 幻想的, おしゃれ, 暖かい, 光, 日本, 小樽

Queue

Queueの特徴は「古いものから順に取り出されていく」という点です。Listではインデックス番号を振ることで自由に値の取り出しや取り込みができたのに対し、Queueではデータを入れた順に取り出さないといけません。

//値の追加
add("a");

//取り出し
poll();

//中身の確認
peek();

Stack

StackはQueueに似ていますが、「新しいものから順に取り出されていく」という違いがあります。値の追加と取り出しはQueueと違ったメソッドを利用しますが、中身の確認に関しては同じメソッドを利用します。

//値の追加
push("a");

//取り出し
pop();

//中身の確認
peek();

Deque

Dequeは「デック」と呼び、正式名称は「Double Ended Queue(両端キュー)」です。「要素を両端から挿入・削除できる」という特徴があります。コレクションを継承している、Queueクラスを継承しています。用意されているメソッドにはエラー時にnullを返すものと例外を投げるものがあります。利用方法は他のコレクションと同じでインスタンス生成をして利用します。

エラー時に例外を投げるエラー時にnullを返す
追加(先頭)addFirst(e)offerFirst(e)
追加(末尾)removeFirst()pollFirst()
取出し(先頭)getFirst()peakFirst()
取出し(末尾)addLast()offerLast()
中身の確認(先頭)removeLast()pollLast()
中身の確認(末尾)getLast()peakLast()

Map

最後にMapを紹介します。Mapはコレクションと間違われることがあるのですが、厳密にはコレクションではありません。「Key」と「Value」を1対1でもたせて要素の管理をしているという点が特徴です。「パスワードは333」という関係性があるとすると「パスワード」の部分をkey「333」の部分をValueといった風に使用します。Keyの重複はできないので、重複した際はValueの値が上書きされます。KeyとValueは参照型のみを持つことができ、Setと同様格納順は保証されません。Mapを扱うに際しては以下のようなメソッドを利用します。

//すべての要素を削除
clear()

//キーkeyがマップに含まれているかを判定
containsKey(Object key)

//値valueがマップに含まれているかを判定
containsValue(Object value)

//キーkeyに対応する値を取得
get(Object key)

//マップが空かを判定
isEmpty()

//すべてのキーを取得
keySet()

//指定されたキー/値の組み合わせを追加
put(K key, V value)

//指定のキーを削除
remove(Object key)

//要素数を取得
int size()

//すべての値を取得
Collection<V> values()

Mapの実装クラスはSetと似ており、HashMap、TreeMap、LinkedHashMapの3つがあります。HashMapは最も高速で動き、TreeMapはKeyによる自動ソート機能があります。LinkedHashMapはデータを格納順で取り出したい場合に使用します。

ダイヤモンド演算子の利用

木のおもちゃ, ビルディング ブロック, Legematerial, 虹色, ダイヤモンド, バイオレット

次にコレクションなどを扱う上で、必ず必要になってくる知識であるダイヤモンド演算子について説明していこうと思います。ダイヤモンド演算子は、Java7から実装された機能です。

List<データ型> 変数 = new ArrayList<データ型>();

インスタンスを作成するときには以下のようにするのが通常です。<>のことをジェネリクスといい、コレクションの持つ値のデータ型を指定しなくてはなりません。しかし、ジェネリクスの中が複雑になったとき、コンストラクタ部分のジェネリクスに値をわざわざ指定するのはめんどくさいです。そのような場合、データ型を省略して次のように記述することができます。

List<データ型> 変数 = new ArrayList<>();

この省略したジェネリクスの形をダイヤモンド演算子といいます。

最後に

コレクションはjavaを扱う上で必ず利用するものになります。特にListやMapは頻出です。値の取り出し方などもコレクションによって違うので、特徴を抑えて使うようにしてくださいね!また、コレクションなどの手段の値に対して何かしら操作したい場合はStreamクラスを使用することが多いです。集団をまとめるにはコレクション。集団に対して操作を行う場合は「Stream」を疑うようにしてくださいね!

タイトルとURLをコピーしました