2013-05-30 4 views
0

Если у меня есть ArrayList объектов в Java, является ли базовая реализация действительно просто массивом ссылок на объекты? Я создаю этот метод:Разница в размере массива

//method returns all combinations of Objects 
public ArrayList<ArrayList<Object>> getAllCombinations(ArrayList<Object> allObjects){ 

} 

Как я начал думать об этой проблеме, я подумал, если я мог бы просто вернуть ArrayList<ArrayList<Integer>> где Интс были позиции в AllObjects (по существу, думая, что это будет использовать значительно меньше памяти). Но потом я начал думать, что каждое значение реализации массива просто указывает на расположение памяти объектов в и что массив не создает новые объекты для каждого созданного мной ArrayList (который определенно будет использовать больше памяти). Таким образом, на самом деле, он будет использовать одну и ту же память, если я просто реализую метод, упомянутый выше, не так ли?

Я думаю, что нужно понимать распределение памяти в Java немного лучше ...

ответ

1

Да, массив или ArrayList содержит только ссылки на объекты, а не сами объекты. Таким образом, каждый элемент массива использует 4 байта памяти (на 32-битной машине), независимо от размера базовых объектов.

Так что держите его простым и возвращайте все, что имеет смысл.

+0

Хотя я вижу то, что вы делаете, по крайней мере, немного желательно сохранить, что каждый элемент использует только 4 байта. Хотя верно, что ссылка только такая большая, это не учитывает тот факт, что пространство должно быть выделено из кучи для каждого из объектов. – scottb

+0

@scottb Да, очевидно, что op, похоже, обеспокоен тем, что помещение объектов в arraylist удвоит размер, который они используют. Я попытался объяснить, что даже большой объект добавит 4 байта «использования памяти» при вводе в список. (Это упрощение, поскольку базовый массив не изменяется при каждом добавлении) – assylias

+0

@scottb вы могли бы объяснить, что вы имеете в виду о распределении из кучи для каждого объекта? – sunrize920

1

Вы получили это право: Элементы вашего ArrayList будут только точка объектам (кроме случаев, когда вы их скопируете явно). Таким образом, обе реализации будут использовать примерно ту же память, что и вы.

Это, кстати, что-то важное для рассмотрения, если вы хотите изменить состояние своих объектов, поскольку они также будут отображаться в старом массиве, откуда они возникли.

Смежные вопросы