Javaでは、次のようなものにlongを使用することはできません。
long size = 0xFFFFFFFF; //2^32-1
byte [] data = new byte[size];
また、intは0x7FFFFFFF(2 ^ 31-1)までしか高くなりません。このサイズのバイト配列を宣言することは可能ですか?
Javaでは、次のようなものにlongを使用することはできません。
long size = 0xFFFFFFFF; //2^32-1
byte [] data = new byte[size];
また、intは0x7FFFFFFF(2 ^ 31-1)までしか高くなりません。このサイズのバイト配列を宣言することは可能ですか?
答えはNO
、これが可能な最大の初期化であるためです。
int size = Integer.MAX_VALUE;
byte [] data = new byte[size];
size
として宣言し、int
再試行してください。
int size = 0x7FFFFFFF; // 0x7FFFFFFF == Integer.MAX_vALUE == 2^32-1
int
配列は、ではなく正のサイズを持つように宣言することしかできませんlong
。int
また、正の最大値(したがって、十分なメモリがあると仮定した場合の整数配列の可能な最大サイズ)はであることに注意して0x7FFFFFFF == Integer.MAX_vALUE
ください。
この例の問題は、配列作成関数が引数としてintを予期しており、longを渡していたことです。
これはコンパイルします:
long size = 0xFFFFFFFF; //2^32-1
byte [] data = new byte[(int)size];
しかし、実行されません。この特定の例ではlong
、数が負であり、要素の数が負の配列を作成できないため、実行されません。それでも、長い変数を使用して配列を作成することは可能ですが、次のように正の数であり、intにキャストする必要があります。
long size = 0x00FFFFFF; //
byte [] data = new byte[(int)size];
どちらがコンパイルされて動作します。
ちなみに、Integer.MAX_VALUE
これがJVMのメモリ制限を超えた場合、サイズからに変更しても何も達成されません。
Integer.MAX_VALUEは、多くのJava概念の制限です。たとえば、文字列/リストはそれより長くすることはできません。
Javaが作成された1995年には、合計4MBのメモリが標準でした。
同じ問題がほとんどの言語に存在します。しかし、今日新しい言語を設計する場合は、確かにを使用しますlong
。
Integer.MAX_VALUE要素を超えるbyte[]を使用できないことに同意します。ただし、配列の配列を持つことができます。
次のようなクラスを作成することをお勧めします。
長いサイズを取り、その数の要素を含むのに十分な大きさのbyte[][]を構築するコンストラクター。
長いインデックスを使用するメソッドを取得および設定する
longを返すsize()メソッド。
もちろん、これは64ビットのJVMと十分な大きさのメモリでのみ実用的です。
1990年代にさえ、配列のインデックスと長さの型にlongではなくintを選択するのは、近視眼的だと感じました。Sunは、数十ギガバイトのメモリを搭載した多くのマシンを販売しており、最大アレイサイズがメモリサイズに近づく傾向と、メモリサイズが大きくなる傾向が一貫してありました。
これは不可能です。配列サイズはint値のみをサポートします。
配列のJDKソースコードを確認できます。int値のみがサポートされています。