【发布时间】:2011-07-23 12:40:04
【问题描述】:
您有没有想过这种 Java 编程语言变化的影响?
String 类被认为是一个不可变的类(这个决定是经过深思熟虑的)。但是字符串连接真的很慢,我自己做了基准测试。于是 StringBuffer 诞生了。非常棒的课程,同步且速度非常快。但是有些人对一些同步块的性能成本不满意,于是引入了 StringBuilder。
但是,当使用 String 连接不多的对象时,类的不变性使其成为实现线程安全的一种非常自然的方式。当我们要管理多个字符串时,我可以理解 StringBuffer 的使用。但是,这是我的第一个问题:
-
例如,如果您有 10 个或更少的字符串要附加,您是否愿意用简单性来换取几毫秒的执行时间?
我也对 StringBuilder 进行了基准测试。它比 StringBuffer 更有效(仅提高了 10%)。但是,如果在您的单线程程序中使用 StringBuilder,如果您有时想要更改设计以使用多个线程会发生什么?您必须更改 StringBuilder 的每个实例,如果您忘记了一个实例,则会产生一些奇怪的效果(考虑到可能出现的竞争条件)。
在这种情况下,您会以性能换取数小时的调试时间吗?
好的,就是这样。除了简单的问题(StringBuffer 比“+”更高效且线程安全,StringBuilder 比 StringBuffer 更快但没有线程安全)我想知道何时使用它们。
(重要:我知道它们之间的区别;这是一个与平台架构和一些设计决策有关的问题。)
【问题讨论】:
-
我仍然不完全确定您的问题是什么,尽管有粗体部分。事实上,你的文字似乎包含了标题中提出的问题的答案,而粗体部分直接相互矛盾(即粗体问题与开头的“重要”通知相矛盾)并且似乎已经回答了Stack Overflow 上无数次。
-
康拉德,我想知道有经验的编码员的意见。我今天想到了这个想法,想知道它是否有任何意义。也许我没有正确地问它(我的英语不是很好)。对此感到抱歉。你的权利,顶部的通知不好,我必须改变它。我想获得“何时使用它们”的答案,但不想选择效率(就像我在这里看到的其他问题一样)。
-
我也对 StringBuilder 进行了基准测试。它比 StringBuffer 更有效(平均只有 10%) 显示基准,你确定你写得对吗,到目前为止我认为我还没有在这个网站上看到一个合适的微基准。
-
真的很简单。尝试一次添加 100,000 个 String 对象(例如,使用 for 循环),您会发现需要更多时间。我已经这样做了 100 次,并做了一个简单的平均。
-
@santiagobasulto,是的,几乎可以肯定是一个糟糕的微基准测试。
标签: java architecture string