2012-10-30 58 views
25

我正在整合由兩個不同的人編寫的代碼,並注意到將字符串值轉換爲長整型已經以兩種不同的方式完成。Long.valueOf(java.lang.String)和new Long(java.lang.String)之間的區別?

編碼器#1已完成此:

String strId = "12345678"; 
... 
Long lId = new Long(strId); 

雖然譯碼器#2已完成此:

String strId = "12345678"; 
... 
Long lId = Long.valueOf(strId); 

在功能上,代碼操作完全相同。每個位都有一個try/catch塊來處理拋出的任何NumberFormatException。傳入的字符串值是一個8位字符串,表示小數點:"12345678",並且在這兩種情況下都正確轉換爲Long

傳遞構造函數中的字符串和使用Long.valueOf()之間是否有任何功能差異?我檢查構造文檔在這裏:這裏

Long(java.lang.String)

和的valueOf(該文檔):

Long.valueOf(java.lang.String)

據我所知,他們都稱parseLong(),所以使用哪個並不重要。我只是想確保我不會在進一步的道路上爲自己的一些奇怪行爲而自責。另外,哪種風格比其他風格更「正確」(哈哈)?

回答

24

不同的是,使用new Long()你總是會創建一個新的對象而使用Long.valueOf()時,如果值在[-128 to 127]之間,則可能會返回緩存的值long

所以,你應該更喜歡Long.valueOf方法,因爲它可以爲你節省一些內存。

如果你看到Long.valueOf(String)的源代碼,它在內部調用Long.valueOf(long),其源代碼,我貼在下面: -

public static Long valueOf(String s) throws NumberFormatException 
{ 
    return Long.valueOf(parseLong(s, 10)); 
} 

public static Long valueOf(long l) { 
    final int offset = 128; 
    if (l >= -128 && l <= 127) { // will cache 
     return LongCache.cache[(int)l + offset]; 
    } 
    return new Long(l); 
} 
+0

這正是我在查閱這個http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Long.java之前所瞭解的內容。來源鏈接。 –

+2

@ArunManivannan ..您可以在jdk安裝目錄中找到源代碼。進入'C:\ Program Files \ Java \ jdk',會有一個'src'文件夾。可能是壓縮格式。解壓縮。轉到'java - > lang - > Long.class'來查看源代碼。 –

+0

這非常有幫助,感謝代碼片段和解釋。 – AWT

3

它們的意思是相同的

public static Long valueOf(String s) throws NumberFormatException{ 
     return new Long(parseLong(s, 10)); 
} 

public Long(String s) throws NumberFormatException { 
    this.value = parseLong(s, 10); 
} 

Source JDK 6.0

+0

阿倫,他們是相同的,如果s是在一定範圍內( - 128 t0 127),如果s在in-in範圍內,它們不一樣。 – kosa

+0

您正在使用哪個版本的Java?在我的Java 6和7版本中,使用了緩存。 –

+0

@Nambari我也這麼認爲。然而,這個實現是令人驚訝的。 –

8

Long.valueOf()應首選:它的一些常用值,而不是作爲構造函數構造一個新的實例返回龍的緩存值。

即使某些Java版本不使用緩存,但使用valueOf()可以在將來的版本中使用,而構造函數將始終創建新實例。

+0

+1,這是正確的。 Long.valueOf是首選。 – kosa

+0

該值範圍是'[-128至127]'具體。但是,我認爲這可以改變。不知道如何。 –

3

無論做parseLong(String, int)內部(INT與值10爲基數),但valueOf具有優勢如下記載:

If a new Long instance is not required, this method should generally be used in preference to the constructor Long(long), as this method is likely to yield significantly better space and time performance by caching frequently requested values.

0

這是PMD插件哪些是在Eclipse中運行放

我檢查的代碼是

Long l = new Long("123456"); 

在JDK 1.5中,調用new Long()會導致內存分配。 Long.valueOf()對內存更友好。

0

我在想如何改變我們的應用程序的緩存的範圍和大小,重載Longs;

這種變化不是由J2SE API支持 一種方法是改變加載Java字節代碼的ClassLoader,甚至與JVMTI (它允許保持這種把戲了項目,如外部調諧)

或,可能會,創建外部緩存和自己的靜態cachedValueOf() 這是直截了當的,但代碼取決於一些不適用的需求是不好的

+0

它是否回答問題?你應該使用'question'選項來提出問題。 – idlerboris

相關問題