Сценарий, который вы описываете, может сэкономить память (хотя на практике я не уверен, что он вообще это сделает), но он, вероятно, добавит немало вычислительных затрат при фактическом размещении объекта в массиве.Учтите, что когда вы делаете new Point()
объект, который вы создаете, динамически размещается в куче.Таким образом, если вы выделяете 100 Point
экземпляров, вызывая new Point()
, нет гарантии, что их расположения будут смежными в памяти (и на самом деле они, скорее всего, не будут выделены смежному блоку памяти).
Так как же экземпляр Point
может на самом деле попасть в «сжатый» массив?Мне кажется, что Java должен был бы явно скопировать каждое поле в Point
в непрерывный блок памяти, выделенный для массива.Это может стать дорогостоящим для типов объектов, которые имеют много полей.Кроме того, оригинальный экземпляр Point
все еще занимает место в куче, а также внутри массива.Таким образом, если он не будет сразу же собран сборщиком мусора (я полагаю, что любые ссылки могут быть переписаны так, чтобы указывать на копию, помещенную в массив, тем самым теоретически разрешая немедленную сборку мусора исходного экземпляра), вы фактически используете больше памяти, чем могли быбыть, если вы только что сохранили ссылку в массиве.
Более того, что если у вас есть несколько «сжатых» массивов и тип изменяемого объекта?Вставка объекта в массив обязательно копирует поля этого объекта в массив.Поэтому, если вы сделаете что-то вроде:
Point p = new Point(0, 0);
Point[] compressedA = {p}; //assuming 'p' is "optimally" stored as {0,0}
Point[] compressedB = {p}; //assuming 'p' is "optimally" stored as {0,0}
compressedA[0].setX(5)
compressedB[0].setX(1)
System.out.println(p.x);
System.out.println(compressedA[0].x);
System.out.println(compressedB[0].x);
... вы получите:
0
5
1
... хотя логически должен быть только один экземпляр Point
.Хранение ссылок позволяет избежать подобных проблем, а также означает, что в любом случае, когда нетривиальный объект используется совместно несколькими массивами, общее использование памяти, вероятно, будет ниже , чем это было бы, если бы в каждом массиве хранилась копия всехполей этого объекта.