В принципе, вы можете:
- рассчитать его по теории:
- посмотреть на реализацию HashMap, чтобы выяснить, что делает этот метод.
- lookпри реализации виртуальной машины, чтобы узнать, сколько места занимают отдельные созданные объекты.
- как-то его измеряют.
Большинство других ответов касаютсяВторой способ, поэтому я посмотрю на первый (в исходном коде OpenJDK, 1.6.0_20).
Конструктор использует capacity
, который является следующей степенью двух> = вашего параметра initialCapacity, таким образом, 1048576= 2 ^ 20 в нашем случае.Затем он создает new Entry[capacity]
и присваивает его переменной table
.(Кроме того, он присваивает некоторые примитивные переменные).
Итак, теперь у нас есть один довольно маленький объект HashMap (он содержит только 3 целых, одну переменную и одну ссылочную переменную) и один довольно большой объект Entry [].Этому массиву требуется место для их элементов массива (которые являются нормальными ссылочными переменными) и некоторых метаданных (размер, класс).
Итак, все сводится к тому, насколько велика ссылочная переменная.Это зависит от реализации виртуальных машин - обычно в 32-битных виртуальных машинах это 32-битные (= 4 байта), в 64-битных виртуальных машинах 64-битные (= 8 байтов).
Итак, в основном на 32-битных виртуальныхмассив занимает 4 МБ, на 64-битных виртуальных машинах - 8 МБ, а также незначительные административные данные.
Если затем заполнить HashTable сопоставлениями, каждое сопоставление соответствует объекту Entry
.Этот объект ввода состоит из одного целого и трех ссылок, занимающих около 24 байтов на 32-битных виртуальных машинах, возможно, двойного на 64-битных виртуальных машинах.Таким образом, ваш HashMap с отображением 1000000 (при условии, что коэффициент загрузки> 1) будет занимать ~ 28 МБ на 32-битных виртуальных машинах и ~ 56 МБ на 64-битных виртуальных машинах.
В дополнение к самим объектам ключа и значения,конечно.