2012-01-03 2 views
6

Если метод возвращает Double, то почему мы будем называть его методом doubleValue? он уже возвращает двойной и в вычислениях, кажется, правильно оценивает.Двойное vs doubleValue в Java

ответ

9

До Java 1.5 авто-бокс (и unboxing) не существовал на Java. Итак, вам понадобится это, чтобы извлечь базовый примитив из Double.

Если вы не знакомы с авто-боксом, вы можете прочитать здесь больше. http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

+0

Итак, из ссылки это предполагает, что вы получаете удар производительности от autoboxing и autounboxing. В критически настроенном цикле вы могли бы вызвать myDouble.doubleValue(), чтобы избежать необходимости отмены отмены? – MedicineMan

+2

@MedicineMan Нет, распаковка просто заключается в том, что компилятор превратит 'double foo = myDouble' в' double foo = myDouble.doubleValue() 'для вас - явное обращение к методу не имеет значения. Основная часть производительности связана с созданием вложенного в коробку объекта «Double» (и, возможно, в меньшей степени, для доступа к куче памяти вместо стека var для получения значения). – yshavit

+0

Ишавит прибил его. Единственный способ избежать штрафа - избегать любого перехода между Double <--> double. Однако это часто непрактично, особенно если вы хотите использовать любые коллекции. Кроме того, это был бы очень редкий случай, когда это действительно было узким местом для приложения. – rfeak

1

Вы вызываете 'doubleValue' на объект Double, чтобы преобразовать из помещенного объекта в примитивный тип данных. Поскольку большую часть времени Double автоматически распаковывается в double, вам обычно не нужно это делать, но если вы хотите быть явным в своем преобразовании, вы можете вызвать этот метод.

1

Вы должны позвонить doubleValue, если вам нужно получить double от Double. Первый - это примитивный тип, а последний - тип объекта-обертки, который в основном инкапсулирует примитивное значение внутри неизменяемого объекта. Если возможно (и я говорю это, не зная точно цели вашего кода), используйте double для всех ваших расчетов; используйте только Double, если вам нужно сохранить значения в Collection или Map; это потому, что типы объектов потребляют больше памяти и могут быть подвергнуты кастинговым операциям.

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

+0

И просто добавить к этому немного и прямо указать: математические операции и тесты (арифметика, сравнение и т. Д.) Не могут быть выполнены с помощью 'Double', только 'double'. – yshavit

1

doubleValue возвращает примитив double от Двухместный Объект. В зависимости от сценария вы хотели бы получить двойное двойное.

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