2010-07-15 3 views
1

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

ответ

8

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

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

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

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++) { } 
+0

Вопрос действительно действителен в некотором смысле - на практике, в Java классы-оболочки определены в терминах примитивных типов, а последние являются «волшебными». Но вполне возможно, что сами классы являются «волшебными», и нет примитивов с типизированными значениями. –

0

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

1

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

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

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

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

0

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

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

@ matto1990: Не понял смысл вашего редактирования, так как ваша версия или моя работа будут работать. Таким образом, я предпочел бы, чтобы мой пост остался один. Но эй, спасибо, что помог мне получить значок «Очистить»! – GreenMatt

+0

Извините, должно быть, объяснил. С некоторыми целыми числами (ниже, я думаю, это так) класс Integer создает их и сохраняет их в памяти. Следовательно, если вы вызываете Integer.valueOf (4), вы получите уже существующий класс. Вызов нового Integer (4) создаст новый экземпляр Integer и сохранит его в памяти. Это всего лишь крошечная вещь, и на практике это вообще не имеет значения. Просто увидел это и подумал, что я его поменяю. Взгляните сюда в документах Java: http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/api/java/lang/Integer.html#valueOf (int) – matto1990

+0

@ matto1990 : Спасибо за объяснение, это вызвало тусклую память. Однако код в вашем редактировании длиннее моего, поэтому он еще лучше доказывает! :-) – GreenMatt

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