2013-04-23 41 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提供的关于类型转换等的任何内建检查和平衡。

我个人认为,应尽可能减少转换,并将数据存储在最具体的对象/原语中。我认为这会使代码更容易阅读,更容易维护,并且在出现错误时更易于排除故障。

相关问题