Сколько памяти использует хеш-таблица? - PullRequest
3 голосов
/ 06 мая 2010

Будет ли хеш-таблица / hashmap использовать много памяти, если она состоит только из ссылок на объекты и целых чисел?

Что касается школьного проекта, мы должны были сопоставить базу данных с объектами (это то, что делается в настоящее время с помощью orm / hibernate), но, стремясь найти хороший способ не хранить идентификаторы в объектах, чтобы сохранить их снова, мы решили поместить все объекты, которые мы создали в hashmap / hashtable, чтобы мы могли легко получить его ID. У меня вопрос, стоило ли мне использовать это, по моему мнению, более элегантный способ решения этой проблемы.

Ответы [ 3 ]

3 голосов
/ 06 мая 2010

Будет ли хеш-таблица / hashmap использовать много память, если она состоит только из объекта ссылки и целые числа?

«много» зависит от того, сколько у вас объектов. За несколько сотен или несколько тысяч ты не заметишь.

Но обычно коллекции Java по умолчанию действительно невероятно неэффективны, когда вы работаете с примитивами (из-за постоянного переноса / распаковки из "примитив в обертку" , как, скажем, "int в целое число "), как с точки зрения производительности, так и с точки зрения памяти (оба связаны, но не идентичны).

Если у вас есть лот записей, например, сотни тысяч или миллионы, я предлагаю использовать, например, Trove коллекций.

В вашем случае вы бы использовали это:

TIntObjectHashMap<SomeJavaClass>

или это:

TObjectIntHashMap<SomeJavaClass>

В любом случае, это должно обойти окружающие коллекции Java по умолчанию как по процессам, так и по процессам (и это должно вызывать гораздо меньше GC и т. Д.).

Вы уклоняетесь от ненужного автоматического (не) бокса от / до int / Integer, коллекции создают намного меньше мусора, изменяют размеры намного умнее и т. Д.

Даже не заводите меня на стандартную Java HashMap<Integer,Integer> по сравнению с TIntIntHashMap от Trove, иначе я схожу с ума;)

1 голос
/ 06 мая 2010

Как минимум, вам потребуется реализация интерфейса Map.Entry со ссылкой на ключевой объект и ссылкой на объект значения. Если ключ или значение являются примитивными типами, такими как int, вам потребуется также тип оболочки (например, Integer), чтобы обернуть его. Map.Entrys хранятся в массиве и размещаются в блоках.

Посмотрите на этот вопрос для получения дополнительной информации о том, как измерить потребление памяти в Java.

0 голосов
/ 06 мая 2010

На это невозможно ответить без цифр. Сколько объектов вы хотите хранить? Не забывайте, что вы уже храните объекты, поэтому комбинация ссылок ключ / объект должна быть довольно маленькой.

Единственное разумное, что нужно сделать, это попробовать и посмотреть, работает ли он на вас. Не забывайте, что у JVM будет максимальное выделение памяти по умолчанию, и вы можете увеличить его (если вам нужно) с помощью -Xmx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...