2013-02-11 4 views
2

Что вы думаете о следующей строке кода ?:Java Autoboxing ValueOf (String)

String s= "10.0"; 
    float f = Float.valueOf(s).floatValue();//1 

нужно ли это? Почему это было бы лучше, используя такой синтаксис, а не с помощью:

float f = Float.valueOf(s);//2 

Он по-прежнему дает те же результаты, принимая преимущество функции Autoboxing.

Вкратце, мой вопрос: зачем выбирать первый синтаксис вместо второго? Все ли они одинаковы?

ответ

5

Короче мой вопрос: почему один должен выбрать для первого синтаксиса вместо второго ? Все ли они одинаковы?

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

На данный момент вы должны просто использовать метод Float.parseFloat(String), который генерирует примитивный поплавок. не


Что касается сходства, то, нет они не полностью одинаковы. Второй включает auto-unboxing от Float до float, в то время как в первом случае нет unboxing. Он выполняет преобразование с использованием данного метода.

+0

С точки зрения сбора мусора, он по-прежнему предпочитает второй (Float.valueOf (s)) вместо (Float.valueOf (s) .floatValue(). Последний создает анонимный объект в куче, тогда как прежний не делает, хотя он использует распаковку. Какой из них более эффективен? Я знаю, что лучше parseFloat (String). Однако, если бы мне пришлось выбирать между 2, что бы вы предложили? (также с точки зрения сбора мусора) заранее заблаговременно – Rollerball

+0

@Rollerball. Нет, в обоих случаях вы создаете объект, как я сказал в своем ответе. Метод Float.valueOf' возвращает 'new Float()'. Таким образом, создается только объект. Таким образом, нет смысла сравнивать, основываясь на сбор мусора. –

+0

@ Rollerball.Если вы заставите меня выбирать только из первых двух (я проклинаю вас за это), я пойду за вторым и воспользуюсь автоматической распаковкой и не буду делать эту задачу вручную. –

0

Разница в том, что первая из них явно преобразуется в поплавок,
, а вторая позволяет ей быть удаленной.

На Java 1.3 автобоксинг недоступен!

Далее в некоторых случаях автобоксинг может создавать нежелательные результаты.
В ситуациях, когда Autoboxing терпит неудачу: см

Джош Блох: Effective Java Second Edition

0

f = Float.valueOf (s);

Функция автобоксинга была введена после Java 5. Этот код даст ошибку при компиляции в более ранних версиях Java.

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