検索

キーワード


【Java】コレクションとは?種類や特徴、ジェネリクスと基本構文の書き方

  • 公開日:2020-07-21 11:35:32
  • 最終更新日:2021-01-25 16:42:20
【Java】コレクションとは?種類や特徴、ジェネリクスと基本構文の書き方

こんにちは、駆け出しプログラマーの若江です!

ここでは初学者として学習を終えた私が、アウトプットの意味も込めてコレクションの概要についてご紹介させていただきます。

できる限り初学者が理解しやすい内容として紹介させていただくので、参考となれば幸いです!


関連記事リンク:配列とは? / プリミティブ(基本)型と参照型の違い / コレクション (List) の特徴と書き方 / コレクション(Set)の特徴と書き方 / コレクション(Queue, DeQue)の特徴と書き方 / コレクション(Map)の特徴と書き方 / コレクション(Iterator)の特徴と書き方

5つのコレクション(List、Set、Queue、Deque、Map)とジェネリクスの概要

コレクションは増減可能な複数のデータを一つにまとめる機能の総称です。

データの個数に合わせて適切なサイズになる箱があり、その箱の中へ物(データ)を詰めるようなイメージをしてください。

箱が臨機応変にサイズを変えることを「可変長」といいます。

ちなみに似たような機能にとして配列がありますが、箱の大きさが変わらないのが配列です。

ここでは前者「コレクション」の種類・特徴について見ていきましょう。


コレクションとは?

上記でも紹介した通り臨機応変にデータを増減できる箱を管理する方法です。

コレクションはインターフェースとして設計されていて、

後に紹介するList、Set、Queue、Dequeはコレクションインターフェースを継承して作られています。

またコレクションとよく似た機能を持つMapも合わせて紹介させていただきます。


5種類のコレクション

まずは代表的なコレクション各種の特徴がどういったものか見ていきましょう。


Listの特徴

・格納されたデータを順番に番号(順序)付けして管理します。

・番号(順序)付けは自動で重複がないように行われます。

・データ格納後であれば、既存の番号を指定して新たなデータを指定の順序に割り込むような形で追加することができます。

 例) [0,a 1,c 2,d] → 1にbを追加 → [0,a 1,b 2,c 3,d]

  ※左側の数字は順序、右側の文字はデータです。順序は0から始まります。

・重複したデータも追加できます。データが重複しているかどうかを管理しません。


Setの特徴

・データを格納する際にデータの中身を見て、重複しないデータのみを管理します。


Queueの特徴

・「先入れ先出し(FIFO)」というデータの取り出し方をします。

 列へ並んだ順番に、列から出ていくようなイメージです。

  FIFO例) 「データの入り口(aから順番に格納)」 → z y x ... c b a → 「データの出口(aから順番に呼び出し)」


Dequeの特徴

・Queueの「先入れ先出し(FIFO)」に加えて「後入れ先出し(LIFO)」が可能です。

 縦長の箱に物を積んで、上から順番に取り出すイメージです。

  LIFO例) 「データの入り口(aから順番に格納) 」→ z y x ... c b a → a b c ... x y z →「データの出口(zから順番に呼び出し)」


Mapの特徴

・データを格納する際に「キー(名前)」と「バリュー(値)のデータを渡して管理する特徴があります。

 このように、1つのキーと1つのバリューをペアで管理することをマッピングと呼びます。

 順序ではなく、キーワードとデータを紐づけて管理するようなイメージです。

・「キー」でバリューを管理/識別します。またキーの重複はできません。

・「バリュー」は格納されたデータのことです。キー名が違えば重複したデータを持つことも可能です。


     

それぞれデータの管理の仕方に違いがあるということがわかりますね。

※FIFOとは「First In First Out」の頭文字を取ったもの、LIFOとは「Last In First Out」の頭文字を取ったものです。


ジェネリクスの概要

コレクションではジェネリクスという機能が使われます。


ジェネリクスとは?

ジェネリクスは、大なり小なりの記号を合わせた「 <> 」で表されます。

・ジェネリクスの使用例: コレクション名< 型 > 変数名 = new コレクションを実装したクラス< 型 >();

 「コレクション名< 型 >」と「コレクションを実装したクラス< 型 >」のジェネリクスには同じ型が記述されます。


汎用的なメソッドやクラス、インターフェースなどの型を明確に宣言するための機能を持っています。

インスタンス生成前は型をぼんやりとさせておいて、インスタンス生成時に<>で型を確定させるようなイメージです。

また、ジェネリクスに入る型は参照型となり、プリミティブ型(基本型)は使えませんので注意してください。


コレクションの書き方

ここでは先述したジェネリクスを使ったコレクションの書き方を紹介します。


コレクションの例

今回は書き方の紹介に ArrayList を使います。

※ListとArrayListの詳細は別記事で紹介させていただきます。

コレクションの基本的な構文はジェネリクスでも紹介した以下を使います。

・コレクションの基本的な構文: コレクション名< 型 > 変数名 = new コレクションを実装したクラス< 型 >();


実際の使用例をサンプルコードで見てみましょう。

//List、ArrayListをimportする
import java.util.ArrayList;
import java.util.List;
//ArrayListはListのインターフェースを持った実装クラス
//ジェネリクスでString型を指定
List<String> list = new ArrayList<String>();

//addメソッドはlistへデータを追加するメソッド
list.add("abcdef");

System.out.println(list);//結果 abcdef が表示される


様々なデータを格納できるコレクションですが、データの型には「int型」や「String型」など、

様々な型があるためジェネリクスで指定した型とは異なる型がデータとして渡される可能性も考えられます。

そういった場合はジェネリクスの機能でコンパイルエラーが発生するようになっており、実行時前にエラーがわかります。


またジェネリクスで使う参照型には「Integer」型や「String」型といった既に用意された型以外にも、

自身で作ったクラスを指定することもできます。

最後にクラスの作成例を確認しておきましょう。

◆自作クラスの作成例

//ジェネリクスで利用するクラスを作成
public class Sample {

  //String型とint型のフィールドを作成
	private String a;
	private int b;

  //setterとgetterを用意
	public String getA() {
		return a;
	}
	public void setA(String a) {
		this.a = a;
	}
	public int getB() {
		return b;
	}
	public void setB(int b) {
		this.b = b;
	}

  //System.out.printlnで文字を出力させる
	public String toString() {
		return a + " " + b;
	}
}


◆ジェネリクスを使って上記クラスをListに格納

import java.util.ArrayList;
import java.util.List;
//Sampleクラスのインスタンスを生成
Sample sample = new Sample();
//インスタンスにデータをセット
sample.setA("test");
sample.setB(1);

//Sampleクラスの型をListに定義
List<Sample> list = new ArrayList<Sample>();
//listに上記sampleを格納
list.add(sample);

System.out.println(list); //結果:セットした「test」と「1」を表示



まとめ

可変長の配列をコレクションといい、コレクションには様々なデータ管理方法が存在しました。

コレクションの型を決める機能はジェネリクスが持ちます。

またジェネリクスで指定できる型は参照型のみとなります。

余談ですが、ジェネリクスの使用例で紹介した コレクション名< 型 > 変数 = new コレクションを実装したクラス< 型 >();

の「コレクション名< 型 >」と「コレクションを実装したクラス< 型 >」は同じ型が入るため、

2つ目のジェネリクス内を空白にすることができます。

・後方のジェネリクスを空白にした例:コレクション名< 型 > 変数 = new コレクションを実装したクラス<>();

後方のジェネリクス(<>)はその形から「ダイヤモンド演算子」と呼ばれる使い方もJDK7以降から可能となりました。


記事関連リンク

配列とは? / プリミティブ(基本)型と参照型の違い / コレクション (List) の特徴と書き方 / コレクション(Set)の特徴と書き方 / コレクション(Queue, DeQue)の特徴と書き方 / コレクション(Map)の特徴と書き方 / コレクション(Iterator)の特徴と書き方


【著者】

若江

30代で異業種となるIT業界へ転職した駆け出しのプログラマです。これまで主に Java や Ruby、HTML/CSS を使って学習を目的としたショップサイトや掲示板サイトの作成を行いました。プログラマとしての経験が浅いからこそ、未経験者の目線に近い形で基礎の紹介をしていきたいと思います。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様