11
ArrayList(int initialCapacity)

およびJavaの他のコレクションは、intインデックスで機能します。

十分ではなくint、範囲を超える必要がある場合はありませんか?int

更新: Java 10またはその他のバージョンでは、このための新しいコレクションフレームワークを開発する必要があります。long現在のコレクションで使用すると、下位互換性が失われます。ではない?

4

2 に答える 2

13

理論的には存在する可能性がありますが、現在、このような大きな配列(整数の範囲外のインデックスを持つ配列)はJVMでサポートされていないため、ArrayListもこれをサポートしていません。

それは必要ですか?これ自体は質問の一部ではありませんが、多く出てくるようですので、とにかく対処します。簡単な答えは、ほとんどの場合、いいえですが、特定の状況では、はいです。intJavaでのの上限値は2,147,483,647、20億を少し超える。これが私たちが話していたバイトの配列である場合、配列に格納できるバイト数の観点から、上限は2GBをわずかに超えます。Javaが考案されたとき、一般的なマシンのメモリがそれの1000分の1であるのは珍しいことではありませんでしたが、明らかにそれほど問題ではありませんでしたが、今ではローエンド(デスクトップ/ラップトップ)マシンでもより多くのメモリがあります。それよりもメモリはもちろん、大きなサーバーは言うまでもなく、誰も到達できない制限ではなくなったことは明らかです。(はい、バイトをラッパーオブジェクトにパックしてそれらの配列を作成することはできますが、ここで取り上げるのはそれではありません。)longデータ型の場合、バイト配列の上限が9.2 Exabytes(90億GB以上)をはるかに超えます。これにより、少なくとも予見可能な範囲で「その制限について賢明に心配する必要はありません」という領域にしっかりと戻ることができます。将来。

では、Javaはこの変更を行っていますか?longJava 10の計画の1つは、ベースのインデックスを持つ配列のサポートを含む可能性のある「ビッグデータ」に取り組むことによるものです。明らかにこれは遠い道のりですが、Oracleは少なくともそれについて考えています:

JDK 9のテーブルには、Java仮想マシン(JVM)をハイパーバイザー対応にし、パフォーマンスを向上させる動きがあります。一方、JDK 10は、より大きなデータセット用に32ビットから64ビットのアドレス可能なアレイに移行できます。

理論的には、複数の配列を使用してデータを格納する独自のコレクションクラスを使用することでこの制限を回避できます。したがって、int-の暗黙的な制限をバイパスできます。したがって、この機能が本当に必要な場合は、現時点ではかなり厄介です。

この機能が導入された場合の下位互換性に関してはどうでしょうか。intもちろん、すべてのsをsに変更することはできませんlong。実装の選択によっては、これらの大規模なコレクションの新しいコレクションタイプでさえ、さらに定型的なものが必要になります(ほとんどのJavaコードでは、これが最善の選択肢かもしれません。)とにかく、重要なのは、下位互換性はもちろん懸念事項ですが、これを回避する方法はいくつかあるので、想像力を働かせても目立たないということです。

于 2012-12-07T16:22:23.763 に答える
2

実際、配列リストなどのコレクションは、現時点では int 値のみをサポートしていますが、この制約をバイパスしたい場合は、マップとセットを使用できます。キーは必要なものであれば何でもかまいません。好きなだけ入力してください。ただ、個人的には配列などの構造体はint値で十分だと思いますが、もっと欲しい場合はDerbyのテーブルを使えばいいと思います、そういう場合はデータベースの方が便利です。

于 2012-12-07T16:33:27.253 に答える