Javaプログラミングのコレクション

Javaプログラミングのコレクション
目次

Javaのコレクション

Javaでは、データを効率よく管理するために、APIが提供されています。
APIは、データの格納、アクセス、操作を容易にするクラスやインターフェースの集まりです。

APIを導入する

import文を使用することで、Javaプログラム内で他のクラスやパッケージの機能を利用できます。
以下の例では、ArrayListを導入して使用しています。

import java.util.ArrayList; // ArrayListクラスを使用するためのimport文

public class Main {
    public static void main(String[] args) {

        // ArrayListのインスタンスを作成
        ArrayList<String> myList = new ArrayList<>();

        // 要素を追加
        myList.add("りんご");
        myList.add("バナナ");
        myList.add("オレンジ");

        // 要素を取得
        String fruit = myList.get(1); // "バナナ"が取得される

        // 要素を削除
        myList.remove(0); // "りんご"が削除される
    }
}

上記の例では、import java.util.ArrayList;というimport文を使用してArrayListクラスを導入しています。
これにより、ArrayListクラスを使用するための宣言が可能になります。
その後、ArrayListをインスタンス化し、要素の追加、取得、削除などの操作が可能となります。

Javaの主なコレクション

コレクション特徴主な実装クラス重複を許すか順序を保持かキーと値の組み合わせ
List順序付きコレクションArrayList, LinkedListはいはいいいえ
Set一意な要素のコレクションHashSet,
TreeSet
いいえいいえいいえ
Mapキーと値のペアHashMap, TreeMapいいえいいえはい

List

List は、順序付きの要素のコレクションです。
List は、追加、削除、検索などの操作が効率的に行えます。
標準的な配列と異なる点は、サイズを後からでも変更できる点です。

ArrayList

ArrayListは、順序付きで要素を保持するコレクションで、要素は配列で管理されます。
「ArrayList」の要素のデータ型は「Object型(すべてのクラスの先祖)」でどんなインスタンスでも格納できます。
ArrayListはランダムアクセスが高速で、リストの末尾に要素を追加する場合も効率的です。

コード例

import java.util.ArrayList;

public class Main {
	public static void main(String[] args) {

		// ArrayListの宣言
		ArrayList<String> list = new ArrayList<>();   

		// 要素の追加
		list.add("Java");
		list.add("Python");
		list.add("JavaScript");

		// 要素の削除
		list.remove("Java");

		// 要素の検索
		int index = list.indexOf("Python");
		System.out.println(index);

		// 要素の取得
		String language = list.get(index);
		System.out.println(language);

		// 要素の全件表示
		for (String lang : list) {
			System.out.println(lang);
		}

	}

}

コードの説明

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {

     // ArrayListの宣言
        ArrayList<String> list = new ArrayList<>();

まず、ArrayListクラスをインポートし、ArrayList型の変数listを宣言します。
ArrayList型は、要素を順序付きで保持するコレクションです。
=ArrayList<String>は Stringを省略しています。

// 要素の追加
        list.add("Java");
        list.add("Python");
        list.add("JavaScript");

次に、listに3つの要素を追加します。
add()メソッドは、指定した要素を末尾に追加します。

// 要素の削除
        list.remove("Java");

次に、listから”Java”という要素を削除します。
remove()メソッドは、指定した要素を削除します。

// 要素の検索
        int index = list.indexOf("Python");        
        System.out.println(index); 

次に、listから”Python”という要素のインデックスを取得します。
indexOf()メソッドは、指定した要素のインデックスを取得し、System.out.println()メソッドを使用して出力します。

// 要素の取得
        String language = list.get(index);
        System.out.println(language);

次に、listから”Python”という要素を取得します。
get()メソッドは、指定したインデックスの要素を取得し、System.out.println()メソッドを使用して出力します。

// 要素の全件表示
        for (String lang : list) {
            System.out.println(lang);
        }

最後に、listのすべての要素を表示します。
for文を使用して、listの要素を順次取得し、System.out.println()メソッドを使用して出力します。

実行結果

上記のコードを実行すると、以下の出力結果が得られます。

0            // 取得したインデックス
Python       // 取得したインデックスの値
Python       // 全件表示(Javaは削除されている)
JavaScript   
LinkedList

LinkedListは双方向リンクリストを実装したコレクションで、要素はリンクで接続されています。

双方向連結リスト

双方向連結リストとは、要素が双方向にリンクで連結されたデータ構造です。
要素は、頭から尾に順に連結されており、各要素は前後の要素へのポインタを持っています。
要素の挿入・削除が高速で、リストの先頭や中間に要素を追加・削除する場合に優れています。

コード例

上記ArrayListのコードを少し書き換えたものです。

import java.util.LinkedList;
import java.util.Iterator;

public class Main {
    public static void main(String[] args) {

        // 双方向連結リストの宣言
        LinkedList<String> list = new LinkedList<>();

        // 要素の追加
        list.add("Java");
        list.add("Python");
        list.add("JavaScript");

        // 要素の削除
        list.remove("Java");

        // 要素の検索
        int index = list.indexOf("Python");

        // 要素の取得
        String language = list.get(index);

        // 要素の逆順にアクセス
        Iterator<String> des = list.descendingIterator();
        while (des.hasNext()) {
            System.out.println(des.next());
        }
    }
}

// 要素の逆順にアクセス

// 要素の逆順にアクセスの部分の説明です。

// 要素の逆順にアクセス
Iterator<String> des = list.descendingIterator();

まず、descendingIterator()メソッドを使用して、要素を逆順に取得するイテレータを変数desに取得します。

while (des.hasNext()) {
    System.out.println(des.next());
}

次に、while文を使用して、イテレータが次の要素を持っている限り、要素を順番に取得して出力します。

  • descendingIteratorは、双方向連結リストの要素を逆順に取得するイテレータです。
  • hasNext()メソッドは、イテレータに次の要素があるかどうかを判定します。
  • next()メソッドは、イテレータの次の要素を取得します。

実行結果

上記のコードを実行すると、以下の出力結果が得られます。

JavaScript
Python
イテレータのイメージ
ロボ君

descendingIterator()listの要素に矢印をつけて、next()で一つ移動するイメージデス。

りある

こんな感じかな?

list = {Python,JavaScript}
           □, □
           ↑
      iterator

des.next()

list = {Python,JavaScript}
           □, □
              ↑
      iterator

ArrayListとLinkedListは、どちらも順序付きで要素を保持するコレクションです。
ArrayListは配列で要素を管理するのに対し、LinkedListは連結リストで要素を管理します。

Set

重複を許さないコレクションです。
要素の追加、削除、検索などの操作が高速に行えます。
重複を許さないデータの格納に適しています。

HashSet

HashSetは、重複を許さないコレクションです。
要素は、ハッシュテーブルで管理されます。

  • 重複を許さない。
  • 要素の追加、削除、検索などの操作が高速に行える。
  • 要素にランダムアクセスできる。

コード例

import java.util.HashSet;

public class Main {
    public static void main(String[] args) {

        // HashSetの宣言
    	HashSet<String> set = new HashSet<>();

        // 要素の追加
        set.add("Java");
        set.add("Python");
        set.add("JavaScript");


        // 要素の削除
        set.remove("Java");

        // 要素の検索
        boolean contains = set.contains("Python");
        System.out.println(contains);
        
        // 要素の全件表示
        for (String language : set) {
            System.out.println(language);
        }
    }
}

コードの説明

import java.util.HashSet;

public class Main {
    public static void main(String[] args) {

        // HashSetの宣言
    	HashSet<String> set = new HashSet<>();

HashSetクラスをインポートし、HashSetのインスタンスを生成します。

// 要素の追加
        set.add("Java");
        set.add("Python");
        set.add("JavaScript");

次に、add()メソッドを使用して、要素を追加します。
add()メソッドは、指定された要素がまだ存在しない場合のみ、要素を追加します。

HashSetクラスは、要素が重複しないように設計されています。
重複する要素を追加すると、最初の要素のみが追加されます。

// 要素の削除
        set.remove("Java");

remove()メソッドを使用して、要素を削除します。
remove()メソッドは、指定された要素が存在する場合のみ、要素を削除します。

// 要素の検索
        boolean contains = set.contains("Python");
        System.out.println(contains);

contains()メソッドを使用して、要素が存在するかどうかを調べます。
contains()メソッドは、指定された要素が存在する場合にtrueを返します。

// 要素の全件表示
        for (String language : set) {
            System.out.println(language);
        }

forループを使用して、要素をすべて表示します。
forループは、setの要素を順番に取得し、language変数に格納します。その後、System.out.println()メソッドを使用して、language変数の値を表示します。

↓実行結果

true
JavaScript
Python
補足

HashSetクラスは、要素の順序を保持しないため、forループを使用して要素を表示すると、要素の順序は保証されません。

TreeSet

TreeSetは、重複を許さないコレクションです。
要素は、二分木で管理されます。

  • 重複を許さない。
  • 要素の追加、削除、検索などの操作が高速に行える。
  • 要素を順序付きで保持する。

コード例

import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {

    	// TreeSetの宣言
    	TreeSet<String> set = new TreeSet<>();

    	// 要素の追加
    	set.add("Java");
    	set.add("Python");
    	set.add("JavaScript");
    	set.add("MySQL");
    	set.add("JSP");
    	set.add("Servlet");

    	// 要素の削除
    	set.remove("Java");

    	// 要素の検索
    	boolean contains = set.contains("Python");
    	System.out.println(contains);

    	// 要素の全件表示
    	for (String language : set) {
    	    System.out.println(language);
    	}
    }
}

↓実行結果

true
JSP
JavaScript
MySQL
Python
Servlet
HashSetとTreeSetの使い分け
  • 重複を許さないデータの格納が必要な場合は、HashSetとTreeSetのどちらでも使用できます。
  • 要素の追加や削除を頻繁に行う場合は、HashSetが適しています。
  • 要素の順序を保持する必要がある場合は、TreeSetが適しています。
項目HashSetTreeSet
重複許されない許されない
管理方法ハッシュテーブル二分木
要素の追加や削除高速高速
要素の検索高速高速
要素の順序ランダム順序付き
使用例重複を許さないデータの格納重複を許さないソートされたデータの格納

Map

Map は、キーと値のペアのコレクションです。
Map は、キーを使って値を検索できます。

HashMap

HashMap は、ハッシュテーブルのようなデータ構造を備えた Map です。
キーと値のペアを格納し、高速なデータアクセスを提供します。
キーは重複できず、順序はランダムです。
そのため、要素を追加した順序とは異なる順序で要素が取得される可能性があります。

TreeMap

TreeMap は、二分木のようなデータ構造を備えた Map です。
TreeMapは、キーを昇順または降順で保持するツリー構造にキーと値のペアを格納します。
キーと値のペアを格納し、ソートされた順序でアクセスできます。
キーは重複できず、キーに基づいてソートされます。

※Map の例はこちら↓

ラッパークラス

コレクションは基本データ型の情報を直接格納することはできません。
基本データ型の情報をコレクションに格納するには、ラッパークラスを使用します。
ラッパークラスは、基本データ型と同等の型を持ちます。例えば、int型のラッパークラスはInteger型です。

教科書

Pythonの教科書は「やさしいPython」です。

Javaの教科書は「スッキリわかるJava入門 実践編 第3版」です。

著:中山清喬, 著:国本大悟, 監修:株式会社フレアリンク
¥2,860 (2023/11/27 12:33時点 | Amazon調べ)

SQLの教科書は「スッキリわかるSQL入門第3版」です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

プログラミングを勉強中~

目次