Типы примитивов в Java - PullRequest
       62

Типы примитивов в Java

1 голос
/ 15 июля 2010

Зачем использовать примитивные типы в Java вместо классов Wrapper?Я хочу знать, что у нас уже есть классы-обертки в Java, тогда зачем нам использовать примитивные типы?Какова важность примитивных типов в Java?

Ответы [ 4 ]

9 голосов
/ 15 июля 2010

Ваш вопрос задом наперед.Примитивные типы являются более фундаментальными, чем их обертки.

Действительно единственная полезная вещь, которую дают обертки, - это возможность обращаться с ними как с подклассом Object (чтобы их можно было помещать в коллекции и т. Д.).Все действительно полезные вещи (такие как арифметика и упорядочение) обеспечиваются примитивным типом.

Обратите внимание, что хотя вы можете говорить такие вещи, как:

Integer i = Integer.valueOf(4);
Integer j = Integer.valueOf(2);
Integer k = i + j;

, это просто удобство.Внизу последняя строка выглядит примерно так:

Integer k = Integer.valueOf(i.intValue() + j.intValue());

, так что арифметика встречается с примитивными значениями.(Это удобство известно как упаковка / распаковка.) Это снижает производительность, так что на моей машине этот цикл:

for (int i=0; i<10000000; i++) { }

примерно в 10 раз быстрее, чем этот цикл:

for (Integer i=0; i<10000000; i++) { }
1 голос
/ 15 июля 2010

В Java каждый объект имеет некоторый объем служебной информации.Это зависит от JVM и размера «слова» в целевой архитектуре (64-разрядный по сравнению с 32-разрядным), но я обычно оцениваю, что каждый объект имеет около 40 байтов «служебной информации» сверх того, что требуется для его полей.

Так, например, массив из 1024 байтов - это один объект с 40 байтами служебных данных;он имеет член length (int), которому требуется 4 байта, и ему требуется 1 байт для каждого элемента, в общей сложности около 1 тыс.

Массив из 1024 Byte экземпляров имеетиздержки самого массива, его члена length, а затем около 41 байта для каждого экземпляра Byte (40 байтов служебной информации плюс 1 байт для данных).В общей сложности это более 41k!Гораздо больше, чем примитив byte[].

Поскольку типы-обертки являются неизменяемыми, были предложены хитрые приемы, чтобы примитивные данные выглядели как экземпляры обернутых объектов, но до сих пор ни один из этих механизмов не реализован.

0 голосов
/ 15 июля 2010

[юмор] Чтобы сохранить набор текста!Это:

    int i = 4;
    int j = 38;
    int k = i + j;

короче, чем:

    Integer i = new Integer(4);
    Integer j = new Integer(38);
    Integer k = i + j;

[/ юмор]

На самом деле, другие ответы говорят это лучше, чем я мог.

0 голосов
/ 15 июля 2010

производительность, примитивные классы отображаются на процессор без необходимости выполнять столько операций.
В случае логических, int и float - вы можете сделать их энергозависимыми и гарантировать, что они не требуют синхронизации (чтение и запись являются атомарными)

...