Хранение нескольких типов данных в одном двумерном массиве - PullRequest
2 голосов
/ 24 февраля 2011

Мне нужно хранить несколько типов данных (в основном int или string) внутри двумерного массива.Использование Object[][] решает проблему.Но это хороший способ сделать это?

Как массив Object[][] резервирует пространство кучи?Я имею в виду, в соответствии с каким типом данных?Приводит ли это к потере ресурсов?

Я пытался сделать что-то вроде этого: -

Object[][] dataToBeWritten={ {"Pami",34,45}, {"Ron","x",""}, {"spider","x",""} };

Редактировать : Вы можетепредложить любые лучшие альтернативы, даже если они существуют ..

Ответы [ 4 ]

3 голосов
/ 24 февраля 2011

См. Как рассчитать использование памяти для массива Java и Использование памяти для объектов Java: общее руководство .

Например, давайте рассмотрим массив размером 10x10. Во-первых, «внешний» массив имеет 12-байтовый заголовок объекта, за которым следует пробел для 10 элементов. Эти элементы являются объектными ссылками на 10 массивов, составляющих строки. Это составляет 12 + 4 * 10 = 52 байта, которые затем должны быть округлены до следующего, кратного 8, что дает 56. Затем каждая из 10 строк имеет свой собственный 12-байтовый заголовок объекта, 4 * 10 = 40 байтов для фактической строки целых чисел, и снова, 4 байта заполнения, чтобы привести общее количество для этой строки, кратное 8. Таким образом, в сумме это дает 11 * 56 = 616 байтов. Это немного больше, чем если бы вы рассчитывали на 10 * 10 * 4 = 400 байт для сотен самих «сырых» целых.

Я думаю, что это только для Hotspot. Ссылки на любой объект - это просто ссылки на целые, по 4 байта каждый, независимо от того, является ли объект действительным или нулевым. Требование к запасным частям для самих объектов - это совсем другая история, поскольку пространство не зарезервировано или что-то подобное при создании массива.

1 голос
/ 24 февраля 2011

Альтернатива:

Используйте правильные классы.Вы пытаетесь использовать динамический подход в статически типизированном языке.Дело в том, что Object[] не помогает читателю вашего кода ни о чем, о чем он читает.На самом деле я даже не могу предложить дизайн для класса, потому что не могу понять ваш пример.Что такое {"Pami",34,45} и как это должно быть связано с {"spider","x",""}?

Итак, предположим, что эта информация похожа на что-то вроде фу, вы должны создать класс Foo и собрать все эти вещи в Foo[] или List<Foo>.

Помните: не только комментарии хранят информацию о вашем коде.Система типов содержит ценную информацию о том, чего вы пытаетесь достичь.Object не содержит такой информации.

1 голос
/ 24 февраля 2011

Массив Objects - это в основном массив указателей.Однако это то, что вы получаете с любым массивом не примитивных типов в Java - массивом Objects, массивом Strings и массивом роботов одинаковой длины, занимающих точно такое же пространство.Пространство кучи для реальных объектов не выделяется, пока вы не инициализируете объекты.

1 голос
/ 24 февраля 2011

Все объекты хранятся по ссылке. Таким образом, ссылка на кучу памяти сохраняется. Поэтому объем памяти, выделенной для массива, составляет один размер (ссылка) на запись.

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