2013-07-07 3 views
1

Неужели дешевле, чем лучше избегать? Из this Java Tutorial:Неужели дешево?

public class ValueOfDemo { 
    public static void main(String[] args) { 

     // this program requires two 
     // arguments on the command line 
     if (args.length == 2) { 
      // convert strings to numbers 
      float a = (Float.valueOf(args[0])).floatValue(); 
      float b = (Float.valueOf(args[1])).floatValue(); 

Почему они не просто оставить его как float a = (Float.valueOf(args[0]));? Если они представили оператора бриллианта, чтобы сэкономить время программистам, почему бы им не воспользоваться функцией распаковки? Это дешевле делать это вручную, как они?

Заранее спасибо.

+1

Смотрите также: [Почему люди до сих пор используют примитивы в Java?] (Http://stackoverflow.com/questions/5199359/why-do-people-still-use-primitive-types-in- Ява) – jason

ответ

3

На самом деле следующие два Java-приложения дают одинаковый двоичный код (с использованием JDK 7 U25 x64):

ValueOfDemo.java

public class ValueOfDemo 
{ 
    public static void main(String[] args) 
    { 
     float a = Float.valueOf("1.5").floatValue(); 
    } 
} 

Compiling:

javac ValueOfDemo.java 

Разборка:

javap -c -cp . ValueOfDemo 
public class ValueOfDemo { 
    public ValueOfDemo(); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: return 

    public static void main(java.lang.String[]); 
    Code: 
     0: ldc   #2     // String 1.5 
     2: invokestatic #3     // Method java/lang/Float.valueOf:(Ljava/lang/String;)Ljava/lang/Float; 
     5: invokevirtual #4     // Method java/lang/Float.floatValue:()F 
     8: fstore_1 
     9: return 
} 

ValueOfDemo2.java

public class ValueOfDemo2 
{ 
    public static void main(String[] args) 
    { 
     float a = Float.valueOf("1.5"); 
    } 
} 

компилирование:

javac ValueOfDemo2.java 

демонтажных:

javap -c -cp . ValueOfDemo2 
public class ValueOfDemo2 { 
    public ValueOfDemo2(); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: return 

    public static void main(java.lang.String[]); 
    Code: 
     0: ldc   #2     // String 1.5 
     2: invokestatic #3     // Method java/lang/Float.valueOf:(Ljava/lang/String;)Ljava/lang/Float; 
     5: invokevirtual #4     // Method java/lang/Float.floatValue:()F 
     8: fstore_1 
     9: return 
} 
0

Unboxing дешево; то, что вы предлагаете, скомпилировано в код, который вы видели в учебнике. Цель учебника - показать, как использовать floatValue, чтобы он не показывал его, вероятно, будет путать.

Что не так дешево, это создание объекта Float, в первую очередь, для синтаксического анализа строки. Вместо этого используйте Float.parseFloat.

float f = Float.parseFloat(string); 
0

Unboxing не является дорогостоящим в том смысле, что он просто делает то, что вы делали бы себя в среде pre-Java 5. Просто это делается автоматически.

Но, как и все остальное, это дорого, если его использовать без необходимости. Как и в вашем случае, вы должны были использовать parseFloat() напрямую, а не создавать обертку между ними.

В других случаях распаковка настолько прозрачна, что вы не можете реализовать ее препятствующую производительность. Например, если вы пропустили, заметив, что вы использовали тип-оболочку в качестве счетчика внутри цикла, он излишне ненужно будет распаковывать, увеличивать и бокс на каждой итерации.

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