2011-01-21 9 views
8

私はStringを持っており、Stringとして値としてDoubleオブジェクトを作成したいと思います。Double.valueOf(String s)と新しいDouble(String s)を呼び出す違いは何ですか?

私は

Double myDouble = new Double (myString);

呼び出すことができるか、私は差がある

Double myDouble = Double.valueOf(myString);

呼び出すことができますか?私は最初の新しいオブジェクトがヒープ上に作成されていることを推測しています。は既存のオブジェクトを再利用します。余分なクレジットについては

:文字列は、私はダブルヌルが、上記スローNullPointerExceptionが両方になりたい、その場合にはヌル、かもしれません。少ないコードで

Double myDouble = myString == null ? null : Double.valueOf(myString);

を書く方法はありますか?

+3

*どのように余分なクレジットを与えたいですか?あなたは*各* upvoteに限定されています;-) –

+1

*私は最初に、新しいオブジェクトがヒープ上に作成され、2番目のオブジェクトが既存のオブジェクトを再利用することを保証していると推測しています。*あなたは正しく推測しています:-) –

+2

@Andreas_D - 誰かのPayPalアカウントに1,000,000ドルの支払いがあったと思っていましたが、そうですね:スタックオーバフロー担当者はずっと価値があるので、そのオファーを取り消します;] –

答えて

3

は実装に依存します。 openJDK 6 b14Double(String s)のこの実装を使用しています。

this(valueOf(s).doubleValue()); 

だから、内部valueOf(String s)を呼び出し、直接そのメソッドを呼び出すことに比べて少なく、効率的でなければなりません。

+1

この回答を受け入れるのは、「実装に依存する」というフレーズで始まるからです。実際には他の回答からのようです。 –

3

あなたの前提は正しいです。 Doubleが文字列から抜ける2番目の方法は、値がキャッシュから返される可能性があるため、高速にすることができます。

2番目の質問については、NullPointerExceptionをスローする代わりにnullを返すヘルパーnullセーフメソッドを作成することができます。アパッチから

+0

Upvoted forボーナス信用の質問に答える;-) –

3

太陽[オラクル] JDKから

public static Double valueOf(String string) throws NumberFormatException { 
      return new Double(parseDouble(string)); 
} 

&

public Double(String string) throws NumberFormatException { 
      this(parseDouble(string)); 
} 

public Double(String s) throws NumberFormatException { 
    // REMIND: this is inefficient 
    this(valueOf(s).doubleValue()); 
    } 

&

public static Double valueOf(double d) { 
     return new Double(d); 
    } 
+0

特定のJVM実装の実際のソースコードですか?どちらを特定するのに役立つかもしれません。 –

+1

updated .................. –

2

全く違い、少なくともOracleのJDK 1.6で:

public Double(String s) throws NumberFormatException { 
// REMIND: this is inefficient 
this(valueOf(s).doubleValue()); 
} 
+1

コメントには違いがあります。 valueOf()は1つのDoubleオブジェクトを作成し、新しいDouble()は2つを作成します。 –

0

パフォーマンスが懸念される場合は、プリミティブの使用を検討する必要があります。

double myDouble = Double.parseDouble(myString); 
+0

しかし、すべての重要なヌル値を周囲に渡すことは難しくなります。 (NaNを渡すことを推奨しないでください!) –

関連する問題