[Java][Tips] Javaの配列の大きさは、いくつまで指定できるか

以前のエントリーで、「Javaで配列の次元はいくつまで作れるか」というのがありましたが、似たようなご質問をお客様から頂く機会がありました。

Javaの配列の「次元数あたりの配列の長さ」はいくつまで指定できるのでしょうか?

これまた、今まで受けたことのない質問でしたし、自分自身であまり考えたこともなかった内容なので、論より証拠でコードを書いてみました。

どのくらい、というのが想像つかなかったので、まずありえないような大きい数を指定してみました。
100億個の大きさの配列を作るコードです。

public class ArrayMaxTest {
	public static void main(String[] args) {
		int[] array = new int[10000000000];
	}
}

これをコンパイルすると、コンパイルエラーになり、ここで、どのくらいの大きさまで指定できるのかが判明しました。
Eclipseの場合、コンパイルエラーのメッセージは「型 int のリテラル 10000000000 は範囲外です。」と表示されます。そうです、つまり配列の大きさに指定する値のリテラルはint型なのだということがこのメッセージから読み取れます。というわけで、int型の正の値の最大値である「2147483647」を指定してみます。

public class ArrayMaxTest {
	public static void main(String[] args) {
		int[] array = new int[2147483647];
	}
}

今度はコンパイルエラーになりません。では、これより1大きい大きさにするとどうでしょう?

public class ArrayMaxTest {
	public static void main(String[] args) {
		int[] array = new int[2147483648];
	}
}

予想通り、これもコンパイルエラーになります。よって「Javaの配列の次元数あたりの長さに指定できる最大値は、int型の正の値の最大値である」ということになりそうです。

ちなみに、ヒープサイズの大きさを指定せずにデフォルトの状態で「int[] array = new int[2147483647];」を実行しようとすると、OutOfMemoryErrorになります。デフォルトのヒープサイズだと、メモリが足りなくなるのですね。

「[Java][Tips] Javaの配列の大きさは、いくつまで指定できるか」への1件のフィードバック

  1. 何年も前の記事にコメントするのも気が引けたのですが…

    > int[] array = new int[10000000000];
    > int[] array = new int[2147483648];

    上記コードでは配列最大長の検証ができていません。

    javaで数値リテラル「10000000000」や「2147483648」を
    指定する場合は末尾に L が必要ですが、上記コードには
    それがなく、コンパイルエラーとなっているためです。

    配列の大きさにint型を超える値を指定できないのは
    間違いではないのですが、仮に指定できたとしても
    上記コードではコンパイルエラーになってしまします。

    つまり、以下のコードと同じ問題が
    検証で使用したコードには含まれています。

    long a = 10000000000; // int型の範囲外なのでコンパイルエラー
    (long型変数に 100億 が格納できないわけではないが
    コンパイルエラーとなる)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です