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で表現しようとすると、コードの可読性が低くなり、不必要にメモリを消費する可能性もあるということです。
そこで、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で表現しようとすると、コードの可読性が低くなり、不必要にメモリを消費する可能性もあるということです。
2009-09-29 05:31
nice!(0)
コメント(0)
トラックバック(0)
コメント 0