ミュータブルとイミュータブル

イミュータブル(immutable)

Array型のように新しい値を追加したり・削除できないなどデータの数を変えられない状態(不変データ)を、イミュータブル(immutable) といいます。

ミュータブル(mutable)

イミュータブルでなく、新しい値を追加したり・削除できる状態(可変データ)をミュータブル(mutable) といいます。

Collection

Collection(コレクション)とは

コレクションはデータ要素を1つにまとめるクラスで、ミュータブル(mutable)なのでデータ追加、更新、検索などの操作ができます。

Collectionのイメージ
name job hp mp attackPower defencePower
アリス wizard 30 0 10 5
ボブ warrior 10 20 3 5
新規データ追加→ テリー wizard 30 0 10 5

コレクションの種類

Collection(コレクション)はおおきく「List」「Set」「Queue」などにわかれます。

項目 インターフェイス パッケージ クラス 特徴
リスト List java.util.List List 順序どおりに並ぶ
セット Set java.util.Set hashSet 順序どおりではない
キュー Queue java.util.Queue PriorityQueue 追加、取得、検査
デック Deque java.util.Deque ArrayDeque Queueを拡張したもの

List

Listの定義

Listは、index(要素番号)で指定したコレクションで、変数のデータ型を < > で囲んで宣言します。

List<データ型> 変数名;

データの初期化

Arrays.asList() でListデータ初期化できます。

List<データ型> 変数名 = Arrays.asList(データ1, データ2, ....);

ArrayList

Listを拡張したクラスに「ArrayList」「LinkedList」があり、それぞれ特徴があります。

クラス パッケージ 特徴
ArrayList java.util.ArrayList データアクセス・検索が高速
LinkedList java.util.LinkedList データお追加・削除などが高速

ArrayListの変数定義

ArrayListの変数定義は以下のようになります。

ArrayList<データ型> 変数名;

ArrayListの初期化

new ArrayList<>() でデータ初期化します。データの代入は Arrays.asList() を利用します。

データ付き初期化

ArrayListを初期化で直接データを入れる場合、Arrays.asList() を使うこともできます。

ArrayList<データ型> 変数名 = new ArrayList<>(Arrays.asList(値1, 値2, 値3 ...))

ArrayListの定義

ファイル構成

src/character/
├── App2.java
├── Character.java
├── Wizard.java
└── Warrior.java

メインプログラム「App2.java」を作成し、Character型のArrayListを定義します。

App2.java
package character;

import java.util.ArrayList;
import java.util.Arrays;

public class App2 {

	public static void main(String[] args) {
		ArrayList<Character> characterList = new ArrayList<Character>();
	}

}

add()

add() で、リストの最後にデータを追加します。

ArrayList.add(値)

ArrayListのデータ追加

ArrayList型のCharacterリストを定義し、add()でキャラクターデータを追加します。

App2.java
package character;

import java.util.ArrayList;
import java.util.Arrays;

public class App2 {

	public static void main(String[] args) {
		ArrayList<Character> characterList = new ArrayList<Character>();
		characterList.add(new Wizard("アリス"));
		characterList.add(new Wizard("テリー"));
		characterList.add(new Warrior("ボブ"));
	}

}

データの表示

for文でCharacterリストを繰り返して、キャラクター名を表示してみましょう。

	public static void main(String[] args) {
		ArrayList<Character> characterList = new ArrayList<Character>();
		characterList.add(new Wizard("アリス"));
		characterList.add(new Wizard("テリー"));
		characterList.add(new Warrior("ボブ"));

		for (Character character : characterList) {
			System.out.println(character.name);
		}
	}
結果
アリス
テリー
ボブ

size()

size() でArrayListのデータ個数を確認してみましょう。

int dataCount = characterList.size();
System.out.println(dataCount);
結果

リストデータが3個になりました。

3

get()

ArrayListクラスのget() で、インデックス指定した値を取得できます。

ArrayList.get(index)

「characterList」から index=1 の値を取得して、コンソール表示してみましょう。

Character selectCharacter = characterList.get(1);
System.out.println(selectCharacter.name);
結果
テリー

set()

set() は、リストから指定したインデックスのデータを更新します。

ArrayList.set(index, データ)
characterList.set(0, new Warrior("スミス"));
for (Character character : characterList) {
	System.out.println(character.name);
}
結果

ArrayListの最後のデータが削除したことを確認しましょう。

スミス
テリー
ボブ

remove()

remove() は、リストから指定したインデックスのデータを削除します。

ArrayList.remove(index)

最後のデータを削除

リストの最後のデータを取得します。データの個数から1引いた値がインデックスになります。

int lastIndex = dataCount - 1;
characterList.remove(lastIndex);
結果

ArrayListの最後のデータが削除したことを確認しましょう。

スミス
テリー

clear()

removeAll()は、すべてのデータを削除します。

characterList.clear();
System.out.println(characterList.size());
結果

データの個数が0になりました。

0

データ付きで初期化

Arrays.asList()で、最初にデータを初期化もできます。

ArrayList<Character> characterList = new ArrayList<>(
		Arrays.asList(
				new Wizard("アリス"),
				new Wizard("テリー"),
				new Warrior("ボブ"))
		);
}

LinkedList

LinkedListとは

LinkedListは基本的にArrayListと同じデータ構造ですが、データの追加、削除が高速なのが特徴です。

LinkedListのデータ追加

データの追加、削除をメインするのであれば、LinkedListを利用してもよいでしょう。

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

LinkedListはArrayList同様に、add()、remove() で処理できます。

演習

「shop」パッケージに「Drink」クラスを作成して回答してください。

Drink.java
package shop.item;

public class Drink {
	public String name;
	public int price;
	public int stock;

	public Drink(String name, int price, int stock) {
		this.name = name;
		this.price = price;
		this.stock = stock;
	}

}

問題1

ミュータブル(mutable)とは、どんな特徴のオブジェクトですか?

  1. データをあとから追加できないオブジェクト
  2. データをあとから追加できるオブジェクト
  3. データを読み込めるオブジェクト
  4. データを読み込めないオブジェクト

問題2

つぎの表から、ArrayListのデータ「drinkList」を作成し、コンソールに一覧表示してみましょう。

name price stock
コーヒー 350 100
紅茶 400 10
ほうじ茶 300 50

問題3

「drinkList」から「紅茶」をコンソール表示してみましょう。

問題4

「drinkList」につぎの追加してみましょう。

name price stock
コーラ 300 100

問題5

「drinkList」の「コーヒー」を、つぎデータで更新してみましょう。

name price stock
アイスコーヒー 250 50

問題6

「drinkList」から「ほうじ茶」を削除してみましょう。