で
おかげで16ギガバイト、これらの日、多くの場合、サーバ32がありますか?
バイトデータを1つの大きな配列に連結した場合 - 大きな配列のスライスを参照するために、個々の値がどのように見えるかについて考える必要があります。
最も一般的には、あなたが開始すると:ポインタ(?おそらくわずか4バイト)の
public class ByteSlice {
protected byte[] array;
protected int offset;
protected int len;
}
しかし、それはだ8バイト+サイズ+ JVMのオブジェクトヘッダ(64ビットJVM上の12のバイト)。だからおそらく合計24バイト。
私たちがこの単一目的を最小限にしようとするならば、まだオフセットのために4バイトが必要になります。
public class DedicatedByteSlice {
protected int offset;
protected byte len;
protected static byte[] getArray() {/*somebody else knows about the array*/}
}
これはまだ5バイト(おそらく8まで)+ JVMオブジェクトヘッダーです。おそらくまだ合計20バイトです。
オフセットの逆参照のコストとそのオブジェクトを追跡するコストは、小さな配列を直接格納するコストよりも実質的に低いとは思われません。
一つの更なる理論的可能性 - それはオブジェクト構造化代入を考えることが可能である
ではないので、マップキーを構造化代入それがされなくなったデータように「長さ&オフセットません」オブジェクト。次に、(長さ、オフセットなどの)スカラーパラメータのセットとして渡され、ハッシュマップ実装では、個別のコンポーネントの配列(たとえば、単一のObject [] keyArrayではなく)に格納されます。
しかし、私はあなたの(特に)ユースケースに既存のハッシュマップ実装を提供するライブラリはほとんどないと思います。
の値がの場合、Javaは複数の戻り値またはメソッドOUTパラメータを提供しないため、おそらく無意味です。それは、オブジェクトに非構造化データを「ボクシング」することなく、通信を非実用的にする。ここではマップキーについて具体的に質問していますが、これらはパラメータとして渡されますが返される必要はありません。そのようなアプローチは理論的に検討することができます。
[拡張] さえ与えられ、このことはトリッキーになり - 地図APIおそらくあなたのユースケースのための人口は(、LENオフセット)キーを定義することでなければならないとして、検索対人口のための非対称になることがあります。実用的なルックアップはまだ具体的なbyte []配列によって可能性があります。
OTOH:かなり古いラップトップでさえ16GBになりました。そして、これを書く時間(維持する時間4〜10)は、余分なRAMの小さなコストよりもはるかに価値があるはずです。
配列が(等号を実装)またはhashCode()メソッドはありません、あなたトローブのハッシュマップはあなたのためにこれらを提供していますか? –
ハッシュマップの_key_として 'byte []'を使っているのはなぜですか? –
どのJVMを使用していますか?私の印象は)それは私が等号を(上書き全体の構造は8 –