アットウィキロゴ
Javaプログラミング入門
掲示板 掲示板 ページ検索 ページ検索 メニュー メニュー

Javaプログラミング入門

22. コレクション

最終更新:

javatutorial

- view
管理者のみ編集可

これまでの不便な点と「コレクション」のメリット

10. 配列」では、同じ種類のデータをたくさん扱うときに便利な「連なった箱(配列)」を学びました。
しかし、配列には「最初に決めた箱の数(サイズ)を後から絶対に変えられない」という大きな弱点がありました。

例えば、RPGゲームのパーティメンバーを管理する配列を、 String[] party = new String[3]; と3人分で作ったとします。
冒険の途中で4人目の仲間が加わろうとしても、箱の数が足りないためエラーになってしまいます。
箱の数を増やしたい場合は、新しく大きな配列を作り直して、中身を一つずつ手作業でお引っ越しさせなければならず、非常に面倒です。

そこで登場するのが、今回学ぶコレクションという仕組みです。
コレクションは、データを入れると「自動的に伸び縮みする配列」のようなものです。
これを使えば、後からいくつでもデータを追加したり、途中のデータを削除したりすることが簡単にできるようになります。

伸び縮みする配列「ArrayList」

Javaには様々な種類のコレクションが用意されていますが、一番よく使われるのが ArrayList(アレイリスト) というクラスです。
これは「java.util」パッケージに入っているため、使う前にインポートが必要です。

ArrayListの基本構文

実体を生み出すときは、以下のように書きます。
import java.util.ArrayList;
 
// クラス名<入れるデータの型> 変数名 = new クラス名<入れるデータの型>();
ArrayList list = new ArrayList(); 
ここで新しく登場した < > という記号は、ジェネリクスと呼ばれます。
配列の中に「何のデータ型が入っているか」をコンピュータに教えるための名札のようなものです。
この <String> という名札をつけることで、「このArrayListには文字列(String)しか入れられない」という安全なルールを作ることができます。
💡注意!
ArrayListの < > の中には、クラス(Stringや、過去に作ったHeroクラスなど)しか入れることができません。int や double などの基本データ型はそのまま入れられないというルールがあります。(基本データ型を入れる特別な方法はありますが、まずはStringを入れて練習しましょう)。

ArrayListを使ってみよう

ArrayListには、データの追加や取り出しを行うための便利なメソッドがたくさん用意されています。
ArrayListの代表的なメソッド
メソッド名 役割
add(データ) 最後尾に新しいデータを追加する(箱が自動で増える)
get(番号) 指定した番号(0からスタート)のデータを取り出す
size() 現在入っているデータの「個数」を調べる
remove(番号) 指定した番号のデータを削除する(後ろのデータは前に詰められる)

それでは、実際にRPGのパーティメンバーを管理するプログラムを書いて動きを確認してみましょう。

サンプル:ArrayListTest.java
  1. import java.util.ArrayList;
  2.  
  3. public class ArrayListTest {
  4. public static void main(String[] args) {
  5. // 文字列を入れる伸び縮みするカバンを準備
  6. ArrayList party = new ArrayList();
  7.  
  8. // データを追加する(addメソッド)
  9. party.add("勇者");
  10. party.add("魔法使い");
  11. party.add("僧侶");
  12.  
  13. // サイズ(現在の人数)を確認する(sizeメソッド)
  14. System.out.println("現在の仲間は " + party.size() + " 人です。");
  15.  
  16. // 0番目のデータを取り出す(getメソッド)
  17. System.out.println("リーダーは " + party.get(0) + " です。");
  18.  
  19. // 4人目を追加!(配列と違い、エラーにならず自動で箱が増えます)
  20. party.add("戦士");
  21. System.out.println("戦士が仲間に加わった!");
  22.  
  23. // 繰り返し(for文)を使って全員を表示する
  24. System.out.println("ーーパーティの一覧ーー");
  25. for (int i = 0; i < party.size(); i++) {
  26. System.out.println(party.get(i));
  27. }
  28. }
  29. }
実行結果
現在の仲間は 3 人です。
リーダーは 勇者 です。
戦士が仲間に加わった!
ーーパーティの一覧ーー
勇者
魔法使い
僧侶
戦士 

このように、要素をいくつ追加してもエラーにならず、size() メソッドを使うことで今いくつデータが入っているかも簡単に分かるため、「9. 繰り返し」の for文 との相性が抜群です。

コラム

伸び縮みする魔法の裏側(動的配列の仕組み)

「ArrayListは自動で箱が増える配列」と例えましたが、コンピュータのメモリ(記憶領域)の仕組み上、実は「本当に自動で伸び縮みする配列」を作ることは物理的に不可能です。
では、JVM(Javaの裏側のエンジン)はどうやってArrayListを動かしているのでしょうか?

ArrayList は、内部に普通の配列を持っています。
要素が増えて今の配列に入りきらなくなると、新しい大きめの配列を用意し、元の要素をコピーしてから追加を続けます。
そのため、利用者から見ると自動で大きくなる配列のように使えます。

つまり、魔法のように見えていたのは、実はJavaのクラスライブラリが「面倒な配列の作り直しと引っ越し作業を、プログラマーの代わりに全自動で超高速にやってくれていただけ」なのです。
このように、内部で配列を作り直しながらサイズを変える仕組みのことを「動的配列」と呼びます。

用途に合わせて使い分ける「3つの配列(List・Set・Map)」

今回学んだArrayListは、Javaに用意されている「コレクション(データの集まり)」という便利な仕組みのほんの一部にすぎません。
実はコレクションには、大きく分けて「List(リスト)」「Set(セット)」「Map(マップ)」という3つの基本的なルール(インターフェース)があり、用途に合わせて使い分けることができます。

① 順番通りに並べて管理する「List(リスト)」
今回使った ArrayList は、このListのグループに入ります。
特徴は「入れた順番が必ず守られること」と、「同じデータ(重複)を何個でも入れられること」です。
例えるなら、「順番待ちの受付表」「買い物メモ」です。1番目、2番目…と番号(インデックス)で管理するため、順番が重要な場合に大活躍します。

② 重複を許さない「Set(セット)」
Setの特徴は「同じデータ(重複)は絶対に入らないこと」と、「順番はバラバラに管理されること」です。
例えるなら、「コレクションカードの種類集め」「出席者の名簿」です。
例えば、ゲームで「これまでに倒したモンスターの種類」を記録したいとき。同じスライムを100匹倒しても、Setに入れようとすると「もうその種類は登録されているよ!」とはじいてくれるため、「重複のないリスト」を作りたいときに非常に便利です。(代表的なクラス:HashSet など)

③ ペアで管理する辞書「Map(マップ)」
Mapは少し特殊で、単なるデータの集まりではなく、「キー(見出し)」と「値(中身)」をペアにして保存するという特徴があります。
例えるなら、「国語辞典」「ロッカーの鍵と荷物」です。
「見出し語(キー)」を調べると、その「意味(値)」がすぐに取り出せます。
例えば、RPGで「"勇者" のHPは 100」「"魔法使い" のHPは 80」というように、名前(キー)とHP(値)をセットで管理して、後から「勇者のHPを教えて!」と一瞬で検索したいときに使われます。キーの重複は許されませんが、値の重複はOKです。(代表的なクラス:HashMap など)

3つのコレクションの違いまとめ
種類 順番の管理 同じデータの重複 データの持ち方
List(リスト) 入れた順番通り OK 1つずつ
Set(セット) バラバラ NG 1つずつ
Map(マップ) バラバラ キーはNG、値はOK キーと値のペア

最近更新されたスレッド
人気記事ランキング
ウィキ募集バナー