Потребление памяти коллекциями Java - PullRequest
1 голос
/ 03 июля 2010

Скажи, что я создал 100 000 Векторов

a[0..100k] = new Vector<Integer>();

Если я сделаю это

a[0..100k] = new Vector<Integer>(1);

Будут ли они брать меньше памяти? Это игнорирование того, есть ли в них что-то и накладные расходы на их расширение, когда должно быть более 1 элемента.

Ответы [ 5 ]

8 голосов
/ 03 июля 2010

Согласно Javadoc емкость по умолчанию для вектора равна 10, поэтому я ожидаю, что он займет больше памяти, чем вектор емкости 1.

На практике вам следует, возможно, используйте ArrayList , если только вам не нужно работать с другим API, для которого требуются векторы.

2 голосов
/ 03 июля 2010

Когда вы создаете Vector, вы либо указываете желаемый размер в начале, либо оставляете какое-то значение по умолчанию. Но следует отметить, что в любом случае все, что хранится в Vector, - это просто набор ссылок, которые занимают очень мало места по сравнению с объектами, на которые они фактически указывают.

Так что да, вы изначально сохраните место, но только на сумму, равную разнице между размером по умолчанию и указанной величиной, умноженной на размер ссылочной переменной. Если вы создаете действительно большое количество векторов, как в вашем случае, начальный размер имеет значение.

2 голосов
/ 03 июля 2010

Да, они будут.Установка разумных «начальных размеров» для коллекций - это первое, что я делаю, когда сталкиваюсь с необходимостью радикально улучшить потребление памяти моей программой.

2 голосов
/ 03 июля 2010

Ну, вроде как да.IIRC Vector по умолчанию инициализирует 16 элементов по умолчанию, что означает, что из-за выравнивания байтов и других действий, выполняемых базовой виртуальной машиной, вы сэкономите значительный объем памяти изначально .

Что вы пытаетесьвыполнить, хотя?

1 голос
/ 03 июля 2010

Да, будет.По умолчанию Vector выделяет пространство для 10 элементов.

Vector () Создает пустой вектор, так что его внутренний массив данных имеет размер 10, а его стандартный прирост емкости равен нулю. Инкремент равен нулю.

Следовательно, он резервируетпамять на 10 ссылок на память.

При этом в реальных жизненных ситуациях это редко вызывает беспокойство.Если вы действительно генерируете 100 000 векторов, вам нужно переосмыслить свой дизайн, равный нулю.

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