2015-04-11 4 views
1

Я создаю класс узлов trie, который содержит поле с логическим типом, и я не знаю, что будет лучше использовать логическое или логическое.Java trie node Boolean vs boolean

Я знаю, что один экземпляр Boolean принимает 16 байтов и 4 байта принимает его ссылку в 32-разрядной виртуальной машине. Но булевы имеют константы Boolean.TRUE и Boolean.FALSE, что можно использовать для оптимизации пространства. Таким образом, приложение wiil занимает 4 * N + 32 байта, где N - количество узлов, да?

Насколько, я знаю логическое значение занимает 4 байта (в массиве ее оптимизации до 1 байт на элемент) в 32-битной виртуальной машины тоже)

Однако можно использовать такой код

boolean EOW = Boolean.TRUE; 

, но сколько места займет и сколько времени займет автобокс/inboxing?

Итак, что будет лучше использовать для оптимизации использования пространства и времени? И не могли бы вы ответить мне, сколько пространства это сказывается на 64-битной виртуальной машине?

ответ

3

Вместо этого:

boolean EOW = Boolean.TRUE; 

Просто напишите это:

boolean EOW = true; 

Там нет оснований использовать Boolean.TRUE, он будет автоматически распакованный к примитивному значению true в любом случае, это более эффективно, и менее подробно использовать значение true напрямую.

Используйте только классы обертки, такие как Boolean, если у вас есть все основания для этого - в противном случае используйте примитивные типы, такие как boolean. Одна из причин использования обертки - это когда вам нужно хранить значения в коллекции (например, ArrayList) - классы коллекции могут содержать только объекты, а не примитивные значения, поэтому вам придется использовать класс-оболочку в этом случае.

Использование Boolean объектов никогда не бывает более эффективным, чем использование boolean примитивных значений.

Обратите внимание, что примитивными значениями являются только значения, а не объекты. Если вы используете значение true десять раз в вашем коде, в памяти не будет десяти дубликатов объектов.

+0

eah, я знаю о коллекциях, из-за структуры дженериков. Я знал, что лучше использовать примитивы, чем обертки, но я не был уверен в Boolean –

+0

Итак, вы имеете в виду, что такие значения, как 'true' и' false', это что-то вроде обналичивания? –

+0

в зависимости от вашего сообщения Я могу сделать вывод, что все это займет 'N * sizeOfReferences + 8' bytes? –

3

Просто используйте примитивный тип boolean с true и false. Примитивные типы занимают меньше памяти, работают с лучшей производительностью и являются нулевыми.

0

Я ожидаю, что точный код, который вы вставили, был оптимизирован до boolean EOW = true;, поэтому его не следует распаковывать вообще, но если такой оптимизации нет, тогда у вас не будет затронутой памяти, потому что вы используете статическое поле, которое будет инициализировано только один раз. Тем не менее, вы по-прежнему будете потерять одну операцию по методу неявного запуска booleanValue(), который просто вернет сохраненное значение. На самом деле, я понятия не имею, почему вы хотели бы иметь такое выражение.