Javaの配列の仕組みと使い方のサンプルです。
仕組み | 配列とは |
作成 | 初期化して作成 / 要素の数を宣言して作成 / 同じ値を設定する(fill) |
取得する | 要素を取得(for文、拡張for文、forEach) / 要素を検索 |
要素数を取得(length) / 最後の要素を取得(length-1) | |
変更 | 配列の値を変更 |
ソート/コピー | 要素をソート / 要素をコピー |
変換 | 配列をリストに変換 / リストを配列に変換 |
使用する | メソッドの引数と戻り値が配列 |
配列とは
データ型[] a = { 値1 , 値2 , 値3 }; |
上記は複数の値を変数aに代入しています。
この変数aは、配列として、複数の値を持ちます。
配列の図
- 1つの変数で同じ型の複数の値を保持できます。
- 各項目を要素(element)といいます。
- 要素の位置をインデックス(添字)で管理します。上記図では[0]、[1]、[2]、[3]です。
- int等の基本型だけでなくInteger等の参照型も保持できます。
- インデックスの先頭は0から始まります。
- Javaの配列は固定長です。後から要素の追加や削除は不可能です。
- 後から配列の数を変更する場合はコレクションのArrayListを使用します。
Java ArrayListとListの使い方のサンプル
初期化して作成
配列の宣言と同時に値を設定します。
String[] a = {"赤","黄","青"}; // String型の配列
System.out.println(a[0]);//赤
System.out.println(a[1]);//黄
System.out.println(a[2]);//青
int[] b = {1,2,3}; // int型の配列
System.out.println(b[0]);//1
System.out.println(b[1]);//2
System.out.println(b[2]);//3
Integer[] c = {4,5,6}; // Integer型の配列
System.out.println(c[0]);//4
System.out.println(c[1]);//5
System.out.println(c[2]);//6
byte [] d = {-128,5,127}; // byte型の配列
System.out.println(d[0]);//-128
System.out.println(d[1]);//5
System.out.println(d[2]);//127
16行目は、バイト配列です。データ型がバイト(byte)型で値が-128~127までの数値です。
要素の数を宣言して作成
先に配列の要素の数を宣言して値は後から追加します。
public class Test1 {
public static void main(String[] args) {
String[] color = new String[3]; // 要素数の3を指定
color[0] = "赤"; // 値を設定
color[1] = "黄";
color[2] = "青";
// color[3] = "黒"; ArrayIndexOutOfBoundsExceptionが発生
System.out.println(color[0]);// 赤
System.out.println(color[1]);// 黄
System.out.println(color[2]);// 青
}
}
7行目のように4つめの値を追加しようとするとArrayIndexOutOfBoundsのエラーが発生します。
同じ値を設定する(fill)
Arrays.fill(配列の変数, 設定する値) |
fillメソッドは同じ値を設定します。
String[] color = new String[3];
Arrays.fill(color, "オレンジ");
System.out.println(color[0]); //オレンジ
System.out.println(color[1]); //オレンジ
System.out.println(color[2]); //オレンジ
要素を取得(for文、拡張for文、forEach)
要素の位置は0から始まります。
for文とforEachはループで要素を順に取得します。
String[] color = { "赤", "黄", "青" }; // 配列
System.out.println(color[0]); // 赤
System.out.println(color[1]); // 黄
System.out.println(color[2]); // 青
// for文
for (int i = 0; i < color.length; i++) {
System.out.println(color[i]); // 赤 黄 青
}
// 拡張for文 加算(i++)の表記なし
for (String a : color) {
System.out.println(a); // 赤 黄 青
}
// forEach + ラムダ式
Arrays.stream(color).forEach(c -> System.out.println(c));// 赤 黄 青
// forEach + メソッド参照
Arrays.stream(color).forEach(System.out::println);// 赤 黄 青
18行目の変数c以降はラムダ式です。forEachメソッドは、Java8で導入されました。
21行目のSystem.out::printlnは、メソッド参照です。
要素を検索
for文でループさせて配列の要素を一つずつ確認していきます。
String[] color = { "赤", "黄", "青" }; // 配列
boolean b1 = false;
for (String c : color) {
if (c.equals("黄")) {
b1 = true;
break;
}
}
System.out.println(b1); // true
要素数を取得
lengthプロパティで配列の要素数を取得します。
String[] color = {"赤","黄","青"}; // 配列
System.out.println(color.length); // 3
最後の要素を取得(length-1)
lengthプロパティで要素数を取得し1引いてインデックスとして指定します。
String[] color = {"赤","黄","青"}; // 配列
System.out.println(color[color.length-1]); // 青
配列の値を変更
インデックス(添字)で変更したい要素を指定します。
String[] arr = { "赤", "黄", "青" }; // 配列
arr[1] = "オレンジ";
System.out.println(arr[0]); // 赤
System.out.println(arr[1]); // オレンジ
System.out.println(arr[2]); // 青
3行目は、文字列を配列の変数に代入しています。
要素をソート
Arrays.sortを使用します。
int[] arrNum = { 100, 2, 99 }; // 配列 数値をソート
Arrays.sort(arrNum);
System.out.println(Arrays.toString(arrNum)); // [2, 99, 100]
String[] arrStr = { "da", "abb", "pccc" }; // 配列 文字列をソート
Arrays.sort(arrStr);
System.out.println(Arrays.toString(arrStr)); // [abb, da, pccc]
3行目は、2,99,100になります。100,2,99にはなりません。
7行目は、先頭の文字のabc順に表示されます。
要素をコピー
public static void arraycopy(コピー元配列,開始位置,コピー先配列,開始位置,コピーする要素数) |
Systemクラスのarraycopyメソッドで配列をコピーします。
String[] arrFrom = { "赤", "黄", "青" }; // コピー元の配列
String[] arrTo = new String[3]; // コピー先の配列
System.arraycopy(arrFrom, 0, arrTo, 0, arrFrom.length);
arrTo[1] = "オレンジ"; // コピー先の配列を変更
System.out.println(Arrays.toString(arrFrom)); // 赤 黄 青
System.out.println(Arrays.toString(arrTo)); // 赤 オレンジ 青
6行目は、コピー先の配列の値を変更しています。
7,8行目は、コピー先の値は変わりましたが、コピー元の値は変更されていません。
配列をリストに変換
CollectionsクラスのaddAllメソッドを使用します。リストを変更しても元の配列は変更されません。
String[] arr = { "赤", "黄", "青" }; // 配列
List<String> list = new ArrayList<>(); // リスト
Collections.addAll(list, arr);
System.out.println(list); // [赤, 黄, 青]
リストは参照型のみ設定可能のため、1行目の配列の値がintなどの基本型の場合は4行目でコンパイルエラーになります。
リストを配列に変換
toArrayメソッドでリストの値を配列にします。
// リスト
List<String> list = new ArrayList<>(Arrays.asList("赤", "青"));
// 配列
String[] arr = new String[list.size()];
// リストから配列を作成
list.toArray(arr);
System.out.println(Arrays.toString(arr));// [赤, 青]
4行目は、配列で中身は空です。配列の要素数はリストのサイズでセットしています。
8行目のtoStringメソッドは、配列を引数にして文字列を返します。
メソッドの引数と戻り値が配列
String[] color = {"赤","黄","青"}; // 配列
String[] b = getColor(color);
private static String[] getColor(String[] c1) {
return c1;
}
2行目は、呼び出し元のメソッドです。引数と戻り値が配列です。
4行目は、定義されたメソッドです。引数と戻り値が配列です。
呼び出し元のメソッドの引数の変数名(color)と定義されたメソッドの引数の変数名(c1)は異なっていても使用できます。
関連の記事
Java 2次元配列のサンプル
Java 配列からリスト・セットを作成(addAll/asList)
Java バイト配列の作成と復号のサンプル(getBytes)