2011-01-21 21 views
8

Yani bir String'im var ve String olarak bir değer olarak bir Double nesnesi oluşturmak istiyorum.Double.valueOf (String s) ve yeni Double (String s) çağrıları arasındaki fark nedir?

Ben

Double myDouble = new Double (myString);

arayabilir ya da ben bir fark var mı

Double myDouble = Double.valueOf(myString);

arayabilirim? Yeni bir nesnenin yığında oluşturulduğu ilk garantileri tahmin ediyorum ve ikinci , varolan bir nesneyi yeniden kullanabilir. Fazla kredi için

: string Ben Çift boş olmak istiyorum bu durumda boş, ancak yukarıdaki atış hem NullPointerException olabilir. daha az kod

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

yazma bir yolu var mı?

+3

* Daha fazla nasıl kredi vermek istiyorsunuz? Her bir cevap için * bir * upvote ile sınırlısınız ;-) –

+1

* Sanırım ilk yeni bir nesnenin yığında oluşturulduğunu garanti eder ve ikincisi varolan bir nesneyi yeniden kullanabilir.* Doğru tahmin ediyorsun :-) –

+2

@Andreas_D - Birinin PayPal hesabına 1000,000 dolar ödenebileceğini düşünüyordum, ama haklısın: Yığın Taşması temsilcisi çok daha değerliydi, bu yüzden bu teklifi geri çektim; -] –

cevap

3

uygulanmasına bağlıdır.

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

Yani doğrudan o yöntemini çağırarak kıyasla daha az verimli olmalıdır valueOf(String s) dahili ve çağırır: openJDK 6 b14Double(String s) bu uygulamayı kullanır.

+1

Bu cevabı kabul etmek, "Uygulamaya bağlı" ifadesiyle başlayacağından, diğer cevaplardan göründüğü şekliyle aslında kabul edilir. –

3

Varsayımınız doğru. Çiftten Çift Çıkmanın ikinci yolu daha hızlı olabilir, çünkü değer önbellekten döndürülür.

İkinci soruyla ilgili olarak, NullPointerException'ı atmak yerine boş değer döndüren bir yardımcı güvenli yöntem oluşturabilirsiniz. Apache'den

+0

bonus kredi sorusunu cevaplamak ;-) –

3

güneş [oracle] 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

Bu gerçek kaynak kodu belirli bir JVM uygulamasından mı geliyor? Hangisini tanımlamak için yardım edebilirim. –

+1

güncelleştirildi .................. –

2

en az Oracle JDK 1.6 içinde olursa olsun fark yok,:

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

Fark, yorum kısmında. valueOf() bir Double nesnesi oluşturur, yeni Double() iki oluşturur. –

0

Performans hakkında endişeleriniz varsa, bir ilkel kullanmayı düşünmelisiniz.

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

Ancak, tüm önemli boş değerleri geçirmeyi zorlaştırır. (Lütfen NaN'leri geçmeyi önermeyin!) –

İlgili konular