2013-04-03 3 views
6

Мне нужно создать пространственный эффективный 2D-массив для большого количества 8-битных значений. Я начал писать свой класс, используя несколько слоев абстракции и дженериков для повторного использования кода. Как только я добрался до реализации конкретного класса, мне пришло в голову, что я не могу передать примитивный тип как общий аргумент класса, и мне пришлось бы использовать класс-оболочку. Потому что я обеспокоен экономией пространства, мне нужно знать: , что разница эффективности пространства междуByteмассивом с помощью класса-оболочки по сравнению с примитивнойbyteмассива?Сравнение эффективности использования пространства байтов/байтов Java

+0

но зачем использовать дженерики по 8-битным значениям? Какова цель разных типов, если вы явно сохраняете 8-битные значения? – giorashc

+0

@giorashc Возможно, я захочу позже хранить 'объекты' или' ints' одним и тем же уникальным способом. В настоящее время я храню 8-битные значения. 2D-массив представляет собой конкретную реализацию хранилища, но управление доступом к структуре данных уникально. –

ответ

5

Да, примитивы являются легкими по сравнению с соответствующими объектами класса Wrapper.

Вы можете прочитать об этом здесь: Primitives vs Wrappers

+0

Спасибо, Гиораш, я пытался это сделать одновременно. Мне все еще нужно знать, как создавать ссылки на этом сайте! – IndoKnight

+0

Просто нажмите на значок земли, вставьте свою ссылку, подтвердите и заполните описание между скобками – giorashc

+0

@INdoknight см. FAQ для этого. –

1

Наблюдать этот другой вопрос: Wrappers of primitive types in arraylist vs arrays

Большая проблема с двойным против Double, что последние добавляют некоторое количество служебной памяти - 8 байтов на объект на 32-битной JVM Sun, возможно, более или менее на других. Затем вам понадобится еще 4 байта (8 на 64-разрядной JVM) для обращения к объекту.

Таким образом, если предположить, что у вас есть 1,000,000 объекты, различия заключаются в следующем:

двойной [1000000]

8 байт на запись; всего = 8000000 байт

Двойной [1000000]

16 байт на экземпляр объекта + 4 байта в качестве ссылки; всего = 20 000 000 байт

Независимо от того, зависит ли это от вашего приложения. Если вы не исчерпали память, предположите, что это не имеет значения.

3

Accroding к http://www.javamex.com/tutorials/memory/object_memory_usage.shtml

байт [] размер ~ = 12 + длина

Байт [] размер ~ = 12 + 20 * длина (20 = 16 + 4 размер 1 объекта Байт + 4 байта)

поэтому, байт [] может занимать в 20 раз больше памяти, чем байт []. Это на самом деле максимум, это зависит от того, как вы создаете байт. новый байт всегда является новым объектом, Byte.valueOf всегда является кешированным экземпляром. Это также зависит от CPU, для x64 каждая ссылка занимает 8 байтов.

+0

Я не знаю, кэшируются ли объекты Byte или просто целые числа, но даже если бы они не были такими, я бы подумал, что для любого размера 'Byte' array можно использовать статический' Byte [256] 'для хранения экземпляр каждого значения; накладные расходы для этого будут фиксированы в ~ 4096 байт, каждый массив 'Byte []', в котором используются кэшированные экземпляры, обычно занимает 4 байта на запись. – supercat

+0

Это 4 байта для каждой ссылки на объект Byte, который равен 16 байтам. Что касается кеширования, это зависит от того, как вы его создаете. новый байт всегда является новым объектом. –

+0

@Evgeniy Dorofeev: Ссылка содержит 8 байтов на 64-битной JVM без сжатых ООП. – maaartinus

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