SSブログ

HashMapの大きさ [Java]

Javaのソースコードをレビューしていると、HashMapを作成して、キーと値の組を数個しか入れていないものを見かけたりしています。実際、マッピングとして、3個のキーと値の組しか入れていなくて、そのようなHashMapを3個作成しているコードがありました。

そこで、HashMapのオブジェクトの大きさを調べてみました。HashMapを作成すると、そのインスタンスには、以下のインスタンスフィールドが含まれます。

 (配列)参照型 1個、int型 3個、float型 1個

これだけで、5個×4バイト=20バイトです。参照型は、ネストしたクラスであるEntry型の配列となっており、最初にデフォルトでは大きさ16の配列が生成されています。つまり、16×4バイト=64バイトの大きさの配列です。したがって、デフォルトのままでHashMapを生成すると、84バイトは最低限消費します。

そこに、3個のキーと値の組を入れたとすると、ネストしたクラスであるEntryクラスは4個のフィールドを持ちますので、4×4バイト×3個=48バイトを消費します。HashMapとの合計で84バイト+48バイト=132バイト。

そして、このようなHashMapを3個作ると、132バイト×3個=396バイトとなります。さらにキーがIntegerクラスで値がBooleanクラスであり、個別にインスタンスを生成していました。つまり、キーと値の9個の組だけで、9×2×4バイト=72バイト。すべてを合計すると、396バイト+72バイト=468バイト。

これに対して、大きさ3の配列と大きさ3×3の配列で書き直したので、12×4バイト=48バイト。元々の3個のHashMapで表を構築しようとしているコードは非常に可読性が悪かったのですが、すっきりと書き直すことができ、使用するメモリー量も1/10になりました。

大量のデータを取り扱う場合に、O(1)の計算スピードを得るためにHashMapを利用します。しかし、データが3個しかない場合には、O(N)であるアルゴリズムでも問題ない訳です。通常のプログラミングでは、HashMapの大きさを気にすることはありませんが、単純な配列で表現できる小さなデータをHashMapで表現しようとすると、コードの可読性が低くなり、不必要にメモリを消費する可能性もあるということです。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0