【Java Silver黒本】4章のつまづいたところまとめ。

多次元配列の宣言

宣言 次元数
int[][] array; 2次元
int[][] array[]; 3次元
int[] array[][]; 3次元
int array[][]; 2次元

配列のデフォルト値

デフォルト値
整数型 0
浮動小数点数 0.0
真偽型 false
文字型 \u0000
オブジェクト型 null
public class Main {
  public static void main(String[] args) {
    Item[] items = new Item[3]; // => { null, null, null }
  }
}

class Item {

}

配列の初期化

  • 初期化時に配列の要素数を指定しなければならない(array1
  • 初期化演算子{}は、配列の要素数を自動計算する(array3
  • 初期化演算子を使用する場合、new int[]のブラケット内に要素数を書いてはいけない(array5
  • 初期化演算子を使用する場合、new int[]は省略できる(array6
  • new int[]を省略して初期化演算子のみで初期化できるのは変数宣言時のみ(array7
  • 宣言部分の次元数と、初期化部分の次元数は同じでなければならない(array10
public class Main {
  public static void main(String[] args) {
    int[] array1 = new int[2];
    int[] array2; array2 = new int[2];
    int[] array3 = new int[]{ 1, 2 };
    int[] array4; array4 = new int[]{ 1, 2 };
    int[] array5 = new int[2]{ 1, 2 }; // コンパイルエラー
    int[] array6 = { 1, 2 };
    int[] array7; array7 = { 1, 2 }; // コンパイルエラー
    int[] array8 = {};
    int[] array9; array9 = {}; // コンパイルエラー
    int[][] array10 = new int[2]; // コンパイルエラー
    int[][] array11 = new int[2][3];
    int[][] array12 = new int[2][];
    int[][] array13 = new int[][]{ { 1, 2 }, { 3, 4 }, { 5, 6 } };
    int[][] array14 = new int[][]{ { 1 }, { 2, 3 }, { 4, 5, 6 } };
    int[][] array15 = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
    int[][] array16 = {};
  }
}

cloneメソッド

cloneメソッドはインスタンスのコピーを作るが、配列の要素として参照を持っている場合、参照先のインスタンスはコピーされない。

つまり、同じ参照の配列を持つ別インスタンスが作られる。

public class Main {
  public static void main(String[] args) {
    int[][] array1 = { { 1, 2 }, { 3, 4 } };
    int[][] array2 = array1;
    int[][] array3 = array1.clone();

    System.out.println(array1 == array2); // => true
    System.out.println(array1 == array3); // => false
    System.out.println(array1[0] == array3[0]); // => true
  }
}

System.arraycopyメソッド

配列のコピーを行う。

public class Main {
  public static void main(String[] args) {
    int[] array1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int[] array2 = new int[array1.length];

    Object fromArray = array1;
    int fromIndex = 3;
    Object toArray = array2;
    int toIndex = 1;
    int copyLength = 2;

    System.arraycopy(
        fromArray,
        fromIndex,
        toArray,
        toIndex,
        copyLength
    );

    // array1のインデックス番号3から2つ分の要素を
    // array2のインデックス番号1以降にコピーする
    //
    // array2: { 0, 4, 5, 0, 0, 0, 0, 0, 0 }
  }
}
引数
fromArray コピー元の配列インスタンス
fromIndex コピー元のコピー開始インデックス
toArray コピー先の配列インスタンス
toIndex コピー先のコピー開始インデックス
copyLength コピーする要素数