2011-01-21 5 views
8

그래서 String이 생겼고 String을 값으로 사용하여 Double 객체를 만들고 싶습니다.Double.valueOf (String s)와 새로운 Double (String s)을 호출 할 때의 차이점은 무엇입니까?

나는

Double myDouble = new Double (myString);

호출 할 수 있습니다 또는 나는 차이가

Double myDouble = Double.valueOf(myString);

호출 할 수 있습니다? 나는 새로운 객체가 힙과 두번째에 생성되었다는 첫번째 보장을 추측하고있다. 은 기존 객체를 재사용 할 수있다. 추가 신용를 들어

: 문자열 나는 더블 로 할 경우 널 (null),하지만 위 던져 모두 NullPointerException이 될 수 있습니다. 적은 코드에

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

를 작성하는 방법이 있나요?

+3

* 어떻게 * 여분의 크레딧을주고 싶니 ?? 당신은 각 응답에 * * * upvote로 제한됩니다 ;-) –

+1

* 첫 번째 보장은 힙에 새로운 객체가 생성되고 두 번째 객체가 기존 객체를 다시 사용할 수 있음을 의미합니다.* 정확하게 추측하고 있습니다 :-) –

+2

@Andreas_D - 누군가의 PayPal 계정에 1,000,000 달러를 지불했을 것입니다.하지만 스택 오버 플로우 담당자는 훨씬 더 가치가 있기 때문에 제안을 철회합니다.]] –

답변

3

는 구현에 따라 다릅니다.

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

은 그래서 직접 메소드를 호출에 비해 덜 효율적이어야 valueOf(String s) 내부 및 를 호출 openJDK 6 b14Double(String s)의 구현을 사용합니다.

+1

다른 답변에서 보이는 "구현에 따라 다름"이라는 문구로 시작하므로 실제로이 대답을 수락합니다. –

3

귀하의 가정이 맞습니다. String에서 Double을 가져 오는 두 번째 방법은 값이 캐시에서 반환 될 수 있기 때문에 빠릅니다.

두 번째 질문에 대해서는 NullPointerException을 throw하는 대신 Null을 반환하는 헬퍼 Null Safe 메서드를 만들 수 있습니다. 아파치

+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

적어도 오라클 JDK 1.6에서 어떠한 차이 :

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

의견에 차이가 있습니다. valueOf()는 하나의 Double 객체를 만들고, 새로운 Double()은 두 개의 객체를 만듭니다. –

0

성능에 대해 염려가되는 경우에는 프리미티브 사용을 고려해야합니다.

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

주위 모든 중요한 null 값을 전달하는 것이 어렵게 만듭니다. (패스 NaN을 제안하지 마십시오!) –

관련 문제