以前のエントリーで、「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になります。デフォルトのヒープサイズだと、メモリが足りなくなるのですね。
何年も前の記事にコメントするのも気が引けたのですが…
> int[] array = new int[10000000000];
> int[] array = new int[2147483648];
上記コードでは配列最大長の検証ができていません。
javaで数値リテラル「10000000000」や「2147483648」を
指定する場合は末尾に L が必要ですが、上記コードには
それがなく、コンパイルエラーとなっているためです。
配列の大きさにint型を超える値を指定できないのは
間違いではないのですが、仮に指定できたとしても
上記コードではコンパイルエラーになってしまします。
つまり、以下のコードと同じ問題が
検証で使用したコードには含まれています。
long a = 10000000000; // int型の範囲外なのでコンパイルエラー
(long型変数に 100億 が格納できないわけではないが
コンパイルエラーとなる)