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が適しています。
項目 | HashSet | TreeSet |
---|---|---|
重複 | 許されない | 許されない |
管理方法 | ハッシュテーブル | 二分木 |
要素の追加や削除 | 高速 | 高速 |
要素の検索 | 高速 | 高速 |
要素の順序 | ランダム | 順序付き |
使用例 | 重複を許さないデータの格納 | 重複を許さないソートされたデータの格納 |
Map
Map は、キーと値のペアのコレクションです。
Map は、キーを使って値を検索できます。
HashMap
HashMap は、ハッシュテーブルのようなデータ構造を備えた Map です。
キーと値のペアを格納し、高速なデータアクセスを提供します。
キーは重複できず、順序はランダムです。
そのため、要素を追加した順序とは異なる順序で要素が取得される可能性があります。
TreeMap
TreeMap は、二分木のようなデータ構造を備えた Map です。
TreeMapは、キーを昇順または降順で保持するツリー構造にキーと値のペアを格納します。
キーと値のペアを格納し、ソートされた順序でアクセスできます。
キーは重複できず、キーに基づいてソートされます。
※Map の例はこちら↓
ラッパークラス
コレクションは基本データ型の情報を直接格納することはできません。
基本データ型の情報をコレクションに格納するには、ラッパークラスを使用します。
ラッパークラスは、基本データ型と同等の型を持ちます。例えば、int型のラッパークラスはInteger型です。