Java 64bits - целое число против короткого - PullRequest
0 голосов
/ 11 января 2019

Есть ли веская причина для использования short вместо int в 64-битной JVM?

Я имею в виду, что оба будут занимать 32 бита выделенной памяти.

В этом разделе показано, как Integer может быть быстрее для операций, таких как умножение: [ В java, более эффективно использовать байты или короткие вместо int и float вместо double?

Я также знаю, что массив примитивов предпочтительнее для сохранения выделенной памяти.

Кроме того, есть ли еще что-то, что нужно учитывать во время выбора между этими двумя типами?

1 Ответ

0 голосов
/ 12 января 2019

ТЛ; др

Если у вас нет особого варианта использования, просто используйте:

  • Integer для значений бизнес-объектов, переменных-членов класса.
  • int для больших объемов необработанных данных.

Просто используйте Integer

Для большинства распространенных бизнес-ориентированных Java-приложений обычной практикой является использование 32-битных int или Integer без особых размышлений, если только вы не знаете, что у вас будут значения более 2 миллиардов, в этом случае используйте long или Long. На современном обычном оборудовании нет особых причин для беспокойства, используя short / Short.

Особые случаи

Но так как вы спросили «есть ли что-то еще, чтобы принять во внимание во время выбора», вот три особых случая: применение ограничений, перенос кода C и альтернативное оборудование.

Принудительное ограничение

Если вы хотите применить ограничения short или Short, используйте эти типы. Выбирайте их, когда вы знаете, что у вас должны быть только значения, меньшие, чем приблизительно 32 000, и хотите, чтобы компилятор или JVM времени выполнения обеспечили это.

Например, добавьте один к 101:

short oneOhOnePlusOne = ( (short) 101 + (short) 1 ) ;
System.out.println( "oneOhOnePlusOne: " + oneOhOnePlusOne ) ;
* * 102 тысяча тридцать-семь

Затем попытайтесь превысить ограничение, чтобы увидеть, как компилятор применяет ограничение.

short shortMaxPlusOne = ( Short.MAX_VALUE + (short) 1 ) ;
System.out.println( "shortMaxPlusOne: " + shortMaxPlusOne ) ;

ошибка: несовместимые типы: возможное преобразование с потерями из int в short

См. Этот код, запущенный в режиме реального времени на IdeOne.com .

Код портирования C

Эти различные числовые типы, вероятно, были введены в Java, чтобы упростить перенос кода на C, как в практическом, так и в психологическом отношении. Изобретатели Java прекрасно понимали, что в ту эпоху большинство попыток создания нового языка программирования терпели неудачу из-за критики о том, что он «не похож на C». Таким образом, Objective-C (вдохновение для Java) и, следовательно, чудовище, которое C ++ .

Так что, действительно, если вы переносите код C, используйте соответствующий тип для репликации поведения.

Кстати ... Технически, C не фактически определяет размер своих числовых типов. На практике практически каждая реализация C использует размеры, как в Java.

Между прочим, даже самые современные языки, такие как Swift и Kotlin имеют встроенные числовые типы для 8, 16, 32 и 64-битных целых чисел.

Более строгие аппаратные средства

Если есть вероятность, что ваше приложение может работать на другом оборудовании, не основанном на x86-64 , то вы можете использовать эти типы. Альтернативные реализации Java для такого оборудования могут лучше оптимизироваться для небольших типов.

Примитив и Объект

Массив примитивов предпочтительнее для сохранения выделенной памяти

Прежде всего, не переживайте по этому поводу. Не попадайтесь в ловушку преждевременной оптимизации . На обычном оборудовании с большинством обычных приложений любая экономия памяти при использовании примитивов по сравнению с объектами, массивами и коллекциями будет незначительной. Используйте тип (примитив / объект) и структуру (массив / коллекцию), соответствующие вашему контексту кодирования.

Моя практика:

  • В моем коде объекты.
    Используйте только объекты (Integer, а не int) в моих собственных классах. У меня есть две причины. Во-первых, я из числа поклонников Объектов, которые хотели бы, чтобы Java была чистой ООП без каких-либо примитивов. (Действительно, продолжаются исследования, чтобы выяснить, могут ли примитивы практически исчезнуть в далекой будущей версии Java.) Во-вторых, я обнаружил, что когда я использовал примитив, мне пришлось использовать его в объектах, требующих контекста, таких как коллекции ,
  • С чужим кодом используйте примитивы, если они это делают.
    Вне моих собственных классов я не навязываю проблему, так как излишний автобокс бессмыслен. Если внешний код (не мой) использует примитивы, я использую примитивы в этом контексте.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...