検索

キーワード


【Java】配列/コレクション/Listとは?概要と基本(ハンズオンセミナー用コード解説)

  • 公開日:2021-01-26 08:21:19
  • 最終更新日:2021-01-26 08:18:43
【Java】配列/コレクション/Listとは?概要と基本(ハンズオンセミナー用コード解説)

こんにちは、研修を終えたばかりの駆け出しエンジニアの伊藤です。


東京ITカレッジのJava研修で学んだ内容を復習も兼ねて記事にしたいと思います。


今回は、Javaプログラムでの「配列とコレクション(List)」について説明します。

Javaやプログラムについて勉強し始めた方の参考になれば幸いです!

(eclipseを使用してプログラムを行っています)


関連記事:【Java】たくさんのデータをまとめよう! 配列の基本と使い方を解説!

     【Java】配列のコピーの使い方を解説! Shallowコピーと Deepコピーの違いとは?

     【Java】配列と ArrayListの関係と違いについて解説! 配列同士のの比較方法とは?

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

     【Java】ArrayList, LinkedList, Vector の違いと代表的な8つのメソッド




「配列・コレクションとは?」

配列とは?

同じ型(int型ならint型、String型ならString型等)の複数データを並び順で格納することができる入れ物(データ構造)のことです。

変数と同じように、値を代入したり参照したりすることができます。


変数は1つの値を個々の独立したデータとして持っています。

メモリ上では、空いているところに宣言した型分のスペースを用意し、データを入れているため、各々バラバラに確保された領域に格納されます。

例えば4つのお札の値段を格納し合計を出したい場合。配列を使わず変数だけで表すとなると、変数を4つ定義し、それぞれに値を代入する必要が出てきます。


public class Denomination {

	public static void main(String[] args) {

		int deno1 = 1000;
		int deno2 = 2000;
		int deno3 = 5000;
		int deno4 = 10000;

		int sum = deno1 + deno2 + deno3 + deno4;

		System.out.println("-----計算結果-----");
		System.out.println("合計金額:" + sum + "円");
	}
}


-----計算結果-----

合計金額:18000


変数宣言した場合のメモリのイメージ図

<変数宣言した場合のメモリのイメージ図>




それに対し、配列は複数の値を一まとめにして持つことができます。

メモリ上では、一列に隙間を開けずに領域を確保し、一まとめとして扱いたいデータを順番に入れることができます。

配列を使うと、4つのお札の値段を格納し合計を出したい場合。1つの配列に4つの値を格納できます。

public class DenominationArray {

	public static void main(String[] args) {

		int[] deno = {1000, 2000, 5000, 10000};
		int sum = 0;

		for ( int i = 0; i < 4; i++){
			sum += deno[i];	//sum に[i]番目に入っている値を順番に足していく
		}
		System.out.println("-----計算結果-----");
		System.out.println("合計金額:" + sum + "円");
	}
}


-----計算結果-----

合計金額:18000



配列宣言した場合のメモリのイメージ図

<配列宣言した場合のメモリのイメージ図>


※箱1つひとつを「要素」と呼びます。配列の長さ=要素数となります。

※各要素には番号が振ってあり、この番号を添え字(index)と呼びます。

 indexは必ず、[0]から始まるので、配列の要素数が4つであれば、indexは[0]から[3]までとなります。


上記の例では、4つの値のため変数だけでも対応は可能です。

しかし、扱う値が100や1000になると変数だけでは修正がとても大変になります。

配列であれば、宣言した配列に値を書いていくだけになりコーディングも見やすくなります。

以下では、配列の宣言や書き方等について詳しく触れていきます。



関連記事:【Java】変数とは?定数とは?詳しく解説! 変数の列挙型、代入、型変換、型推論の使い方についても紹介します!

     【Java】たくさんのデータをまとめよう! 配列の基本と使い方を解説!

     【Java】配列のコピーの使い方を解説! Shallowコピーと Deepコピーの違いとは?

     【Java】配列と ArrayListの関係と違いについて解説! 配列同士のの比較方法とは?



Java配列の基本的な宣言と書き方

配列の宣言

配列を使うには、まず配列を宣言します。

以下の宣言方法は違いますが、作成される配列内容はどれも同じになります。

今回は、日本の貨幣単位を例にしていきます。


配列の宣言方法①

基本的な宣言

要素の型名 配列名[]; もしくは 要素の型名[] 配列名;

配列名 = new 要素の型名[要素数];


//宣言方法①のサンプルプログラム
public class Denomination1 {

	public static void main(String[] args) {

		//配列の宣言
		int[] denomination;		//int型の要素を代入できる配列denominationを宣言し用意する
		denomination = new int[10];	//new は new演算子と呼ばれるもので、[]内に指定された数だけ型の要素を作成します。
                                    //ここでは、int型の要素を10個作成して左辺denominationに代入。

		denomination[0] = 1;        //   1 円玉
		denomination[1] = 5;        //   5 円玉    
		denomination[2] = 10;       //  10 円玉
		denomination[3] = 50;       //  50 円玉
		denomination[4] = 100;      // 100 円玉
		denomination[5] = 500;      // 500 円玉
		denomination[6] = 1000;     //1000 円札
		denomination[7] = 2000;     //2000 円札
		denomination[8] = 5000;     //5000 円札
		denomination[9] = 10000;    //10000円札

		System.out.println("-------- [配列の繰り返し表示1] --------");
		for (int i = 0; i < 10; i ++) {
			System.out.println(denomination[i]);
		}
	}
}


-------- [配列の繰り返し表示1] --------
1
5
10
50
100
500
1000
2000
5000
10000


上記は2行に分けて宣言をしましたが、一行にまとめて宣言することもできます

int[] denomination = new int[10];	//要素の型名[] 配列名 = new 要素の型名[要素数];


int[] denomination;  と  int denomination[]; は、どちらでも同じ扱いになるので、書きやすいものを覚えると良いです。


配列の宣言方法②

宣言と同時に初期化(宣言と同時に値を設定)

要素の型名[] 配列名 = {値1, 値2, 値3... };


//宣言方法②のサンプルプログラム
public class Denomination2 {

	public static void main(String[] args) {
		//配列の宣言
		int[] denomination = {1, 5, 10, 50, 100, 500, 1000, 2000, 5000, 10000};
		//要素の型名[] 配列名 = {値1, 値2, 値3... };
		//要素の型名 配列名[] = {値1, 値2, 値3... }; でも可。

		System.out.println("-------- [配列の繰り返し表示2] --------");
		for (int i = 0; i < 10; i ++) {
			System.out.println(denomination[i]);
		}
	}
}


-------- [配列の繰り返し表示2] --------
1
5
10
50
100
500
1000
2000
5000
10000




配列の宣言方法③


要素の型名[] 配列名 = new int[] {値1, 値2, 値3... };


//宣言方法③のサンプルプログラム
public class Denomination3 {

	public static void main(String[] args) {
		//配列の宣言
		int[] denomination = new int[] {1, 5, 10, 50, 100, 500, 1000, 2000, 5000, 10000};

		System.out.println("-------- [配列の繰り返し表示3] --------");
		for (int i = 0; i < denomination.length; i ++) {
			System.out.println(denomination[i]);
		}
	}
}


-------- [配列の繰り返し表示3] --------
1
5
10
50
100
500
1000
2000
5000
10000


配列の要素数の取得

配列名.length


配列の宣言方法③の for文では、

for (int i = 0; i < denomination.length; i ++) 

を使用して、配列の要素数を取得しています。

値の数が多くなると、覚えているのも大変になってくるので、Javaでは配列の要素数を数えて取得してくれる便利な機能があります。覚えておくと、とても役立ちます!


配列と例外に関するエラー

indexは、配列の長さ=要素数の範囲内でなければなりません。

範囲外を指定するとエラーが表示されてしまいます。


//例外エラーサンプル
public class Denomination3 {

	public static void main(String[] args) {
		//配列の宣言
		int[] denomination = new int[] {1, 5, 10, 50, 100, 500, 1000, 2000, 5000, 10000};

		//配列(貨幣単位)の合計
		int sum = denomination[1] + denomination[2] + denomination[3] +
				denomination[4] + denomination[5] + denomination[6] +
				denomination[7] + denomination[8] + denomination[9] +denomination[10];

		System.out.println("-------- [配列の繰り返し表示3] --------");
		System.out.println("貨幣単位の合計金額:" + sum);
	}
}


コンソール表示
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 10
	at com.fs.handson.chapter2.Denomination3.main(Denomination3.java:14)


上記プログラムで存在しない要素をコード内で書いてもコンパイルは成功します。

しかし、実行すると「ArrayIndexOutOfBoundsException」というエラーメッセージがコンソール上に表示されます。indexを[0]からではなく、[1]からにしてしまっているため存在しない[10]が使われてしまっています。

Array(配列)Index(添え字)OutOfBounds(範囲外)Exception(例外)と言う意味で、

「エラーの原因は存在しない要素が使われているため」となります。


関連記事:【Java】たくさんのデータをまとめよう! 配列の基本と使い方を解説!

     【Java】配列のコピーの使い方を解説! Shallowコピーと Deepコピーの違いとは?

     【Java】配列と ArrayListの関係と違いについて解説! 配列同士のの比較方法とは?

     【Java】例外クラスの概要や使用実例を解説


多次元配列

今までは1次元配列、1つの配列だけを取り扱ってきました。

多次元配列とは、2つ以上の配列を使い複数の次元で構成される配列のことです。

2次元配列は、エクセルでいう表のようなものと考えると分かりやすいと思います。


2次元配列の宣言方法

要素の型[][] 配列名 = new 要素の型[][]

または、

要素の型[][] 配列名 = new 要素の型[行数][列数]


例として、2次元配列で3人の持っている貨幣単位毎のお金を表示してみます。


		 15105010050010002000500010000円	
太郎さん	 0        0        0        0        0        0        0        0        0       10
花子さん  0        0        0        0        0        0      100        0        0        0
次郎さん 10       10       10       10       10       10       10        0        0        0


この2次元配列をJavaの配列を使って表してみましょう。


//2次元配列サンプル
public class MoneyArray {

	public static void main(String[] args) {

		int[][] money = new int[][] {	// int[][] money = new int[3][10]; 3行10列でも可
		    new int[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 10},	//太郎さん
		    new int[] {0, 0, 0, 0, 0, 0, 100, 0, 0, 0},	//花子さん
		    new int[] {10, 10, 10, 10, 10, 10, 0, 0, 0, 0},	//次郎さん
		};

		System.out.println("-------- [2次元配列の例 - 3人の持っている貨幣単位毎のお金] --------");
		for (int i = 0; i < money.length; i ++) {
			for (int j = 0; j < money[i].length; j ++) {
				System.out.print(money[i][j] + ", ");
			}
			System.out.println("");
		}
	}
}


-------- [2次元配列の例 - 3人の持っている貨幣単位毎のお金] --------
0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 
0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 
10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 


関連記事:【Java】たくさんのデータをまとめよう! 配列の基本と使い方を解説!

     【Java】配列のコピーの使い方を解説! Shallowコピーと Deepコピーの違いとは?

     【Java】配列と ArrayListの関係と違いについて解説! 配列同士のの比較方法とは?

     【Java】拡張for文とは?基本構文を使った繰り返し処理の書き方

     【Java】ハンズオンセミナー用コード解説 トレーニング5 繰り返し処理(for文,while文)



コレクションとは

配列は宣言時に配列の大きさ(要素数)を決める必要がありました。

しかし、途中で増えることもあったり、大きさが分からなかったりすることもあります。

その場合、コレクションと呼ばれる機能を使用することで可変長の配列(要素数が決まっていない配列)が使えるようになります。

今回はコレクションの中で、List の使い方を説明します。


Listの宣言方法

List<要素の型> 変数名 = new ArrayList<>();


//Listの使用方法例
import java.util.ArrayList;
import java.util.List;

public class ArrayListSample {

	public static void main(String args[]) {

		List<String> list = new ArrayList<>();

		list.add("AAAA");
		list.add("あいうえお");
		list.add("1234");

		// 要素取り出し1
		System.out.println("-------- [要素取り出し1] --------");
		for (int i = 0; i < list.size(); i ++) {
			System.out.println(list.get(i));
		}

		// 要素取り出し2 拡張for文
		System.out.println("-------- [要素取り出し2] --------");
		for (String s : list) {
			System.out.println(s);
		}
	}       
}


-------- [要素取り出し1] --------
AAAA
あいうえお
1234

-------- [要素取り出し2] --------
AAAA
あいうえお
1234


各要素の追加はaddメソッド、要素の取得はgetメソッドを使います。

上記のプログラムでは配列に要素を追加していき、最後に要素をとりだして表示しています。


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

     【Java】ArrayList, LinkedList, Vector の違いと代表的な8つのメソッド



まとめ

Javaでの配列の使い方がなんとなく理解できたでしょうか?

配列はfor文や拡張for文などを併せて使用することが多いので、ぜひfor文も押さえておくと良いと思います。

 関連記事:【Java】拡張for文とは?基本構文を使った繰り返し処理の書き方

      【Java】ハンズオンセミナー用コード解説 トレーニング5 繰り返し処理(for文,while文)



【著者】

伊藤

Javaを研修で3か月学んだ、駆け出しのエンジニアです。
現在は、ベンダー資格を取得するため、勉強を日課にできるよう努力中です。

よく読まれている記事
【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】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

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