2013-04-23 56 views
1

在對象中保存String變量中的數值(也傳入方法並返回字符串)並且稍後只操作它在BigDecimal中轉換並操作時,是不是一個好主意?對String變量執行數學運算是個好主意嗎?

在方法簽名和POJO的使用意圖是可以在double來執行操作或任何其他類型的實現者更喜歡

對於例如

public String operate(String value1, String value2){ 
    BigDecimal val1 = new BigDecimal(value1); 
    BigDecimal val2 = new BigDecimal(value2); 
    return val1.multiply(val2).toString(); 
} 

或者它只是一個開銷?

會影響性能嗎?

+0

是...爲什麼你不把它存儲在BigDecimal – 2013-04-23 10:51:58

+1

性能是否在你的情況?你知道性能會成爲問題嗎?如果沒有,我建議你以最簡單的方式做到這一點。 – 2013-04-23 10:53:43

+2

順便說一句,當你想顯示它時,只將值轉換爲字符串幾乎總是最好的。 (除非字符串是它的自然類型) – 2013-04-23 10:54:40

回答

1

這是從兩個角度來看是一個壞主意:

  1. 所有的操作都需要你翻譯自/至字符串表示
  2. 內存開銷是巨大的。

考慮這個例子。一個普通的int在內存中佔用4個字節。表示爲一個Stringint可以佔據多達72個字節:

  • 16字節 - 對象的開銷,
  • 4個字節 - 高速緩存的散列碼
  • 8個字節 - 參照char數組
  • 24 + 2×10個字節 - (!)char數組本身(10個數字最大值)
  • 最多8個字節用於填充

它是18倍以上的而不是int的原始表示。

+0

同意翻譯目的。但考慮到「int」並不總是如此。大多數操作需要'double',並且它最好在BigDecimal中操作而不是'double'。因此,比較內存使用情況與'BigDecimal'和'String'幾乎類似嗎? – niksvp 2013-04-24 04:18:06

2

從一種格式轉換爲其他格式始終是開銷。將其存儲在格式中,以便您可以對其執行所有操作

1

不知道爲什麼它可能是個好主意。 「Stringly Typed」不是很好的事情。是的,BigDecimal保存了一個更緊湊的數字作爲字節數組,並且還優化以保持long值中的較小值。字符串將作爲兩字節字符的十進制表示形式。

0

這樣做有很多問題。首先,創建和銷燬額外對象的開銷很大,至少有一個用於從/到String的轉換。取決於發生的次數,這可能很重要。其次,每次你從字符串到數字的轉換和返回,你都有解析問題的風險。最後,你規避了Java提供的關於類型轉換等的任何內建檢查和平衡。

我個人認爲,應儘可能減少轉換,並將數據存儲在最具體的對象/原語中。我認爲這會使代碼更容易閱讀,更容易維護,並且在出現錯誤時更易於排除故障。

相關問題