1

ボックス化解除は避けた方がよいほど費用がかかりますか? このJava チュートリアルから:

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]));か?プログラマーの時間を節約するためにダイヤモンド演算子を導入した場合、なぜアンボックス機能を利用しないのでしょうか? 彼らのように手動で行う方が安価ですか?

前もって感謝します。

4

3 に答える 3

3

実際には、次の 2 つの Java アプリケーションは同じバイナリ コードを生成します (JDK 7 u25 x64 を使用)。

ValueOfDemo.java

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

コンパイル:

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
}
于 2013-07-07T10:16:56.703 に答える
0

開梱は安いです。あなたが提案したものは、チュートリアルで見たコードにコンパイルされます。チュートリアルのポイントは、floatValue の使用方法を示すことなので、表示しないと混乱する可能性があります。

それほど安くはないのは、最初に文字列を解析するためだけに Float オブジェクトを作成することです。代わりに Float.parseFloat を使用してください。

float f = Float.parseFloat(string);
于 2013-07-07T10:05:21.623 に答える