Теоретически стек имеет единственный указатель на место в куче, содержащее сам массив. Сам массив представляет собой просто массив указателей, которые также указывают на места в куче, содержащие объекты, на которые вы ссылаетесь.
В Java вы можете рассчитывать на тот факт, что каждый раз, когда вы говорите new ...
, в куче создается пространство. Вообще говоря, всякий раз, когда вы объявляете переменную, компилятор резервирует место в стеке в контексте метода для этой переменной. Для нативных типов это пространство будет содержать фактические байты для представления значения. Для объектов и массивов эта переменная будет содержать ссылку на память.
Так, например, следующие объекты имеют отдельные области памяти, выделенные для них в куче:
new Object[20]
new String("abc")
new List() // This contains a reference to an initial array, which is also on the heap.
Обратите внимание, что в очень редких случаях new String("abc")
предпочтительнее "abc"
, поскольку строковые литералы все равно будут существовать в памяти пакета, а строки неизменяемы. Нет смысла выделять дополнительную память для точной копии строки, которая уже существует в памяти.
На практике единственным предостережением является то, что компилятору вообще не обязательно хранить локальные переменные в стеке. Если он определяет, что область действия переменной достаточно мала, он может оптимизировать ссылку на стек и просто использовать для нее регистр.
person
StriplingWarrior
schedule
10.08.2011