9

Javaでは、次のようなものにlongを使用することはできません。

long size = 0xFFFFFFFF; //2^32-1

byte [] data = new byte[size];

また、intは0x7FFFFFFF(2 ^ 31-1)までしか高くなりません。このサイズのバイト配列を宣言することは可能ですか?

4

6 に答える 6

9

答えはNO、これが可能な最大の初期化であるためです。

    int size = Integer.MAX_VALUE;
    byte [] data = new byte[size];
于 2012-11-16T18:53:39.210 に答える
3

sizeとして宣言し、int再試行してください。

int size = 0x7FFFFFFF; // 0x7FFFFFFF == Integer.MAX_vALUE == 2^32-1

int配列は、ではなく正のサイズを持つように宣言することしかできませんlongintまた、正の最大値(したがって、十分なメモリがあると仮定した場合の整数配列の可能な最大サイズ)はであることに注意して0x7FFFFFFF == Integer.MAX_vALUEください。

于 2012-11-16T18:45:15.077 に答える
2

この例の問題は、配列作成関数が引数として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のメモリ制限を超えた場合、サイズからに変更しても何も達成されません。

于 2012-11-16T18:44:59.337 に答える
2

Integer.MAX_VALUEは、多くのJava概念の制限です。たとえば、文字列/リストはそれより長くすることはできません。

Javaが作成された1995年には、合計4MBのメモリが標準でした。

同じ問題がほとんどの言語に存在します。しかし、今日新しい言語を設計する場合は、確かにを使用しますlong

于 2012-11-16T18:57:27.567 に答える
2

Integer.MAX_VALUE要素を超えるbyte[]を使用できないことに同意します。ただし、配列の配列を持つことができます。

次のようなクラスを作成することをお勧めします。

  • 長いサイズを取り、その数の要素を含むのに十分な大きさのbyte[][]を構築するコンストラクター。

  • 長いインデックスを使用するメソッドを取得および設定する

  • longを返すsize()メソッド。

もちろん、これは64ビットのJVMと十分な大きさのメモリでのみ実用的です。

1990年代にさえ、配列のインデックスと長さの型にlongではなくintを選択するのは、近視眼的だと感じました。Sunは、数十ギガバイトのメモリを搭載した多くのマシンを販売しており、最大アレイサイズがメモリサイズに近づく傾向と、メモリサイズが大きくなる傾向が一貫してありました。

于 2012-11-16T19:00:55.887 に答える
1

これは不可能です。配列サイズはint値のみをサポートします

配列のJDKソースコードを確認できます。int値のみがサポートされています。

于 2012-11-16T18:53:50.513 に答える