你是否曾考虑过Java编程语言的这种变化所带来的影响?
String类被设计为不可变类(这个决定是经过深思熟虑的)。但是字符串连接非常慢,我自己进行了基准测试。因此,StringBuffer应运而生。这是一个非常好的类,它是同步的并且速度非常快。但是有些人对某些同步块的性能成本不满意,于是StringBuilder应运而生。
但是,当使用String连接不太多的对象时,该类的不可变性使其成为实现线程安全的一种非常自然的方式。我可以理解在我们想要管理多个字符串时使用StringBuffer。但是,这里是我的第一个问题:
1. 如果你有10个或更少的字符串要追加,你会为了执行时间中的几毫秒而牺牲简单性吗?
我也进行了StringBuilder的基准测试。它比StringBuffer更高效(只提高了10%)。但是,如果在单线程程序中使用StringBuilder,如果有时想要更改设计以使用多个线程,会发生什么情况?你必须更改每个StringBuilder实例,如果你忘记了其中一个,你将会产生一些奇怪的效果(由可能出现的竞争条件引起)。
2. 在这种情况下,你会为了调试几个小时而牺牲性能吗?
好的,这就是全部内容。除了简单的问题(StringBuffer比"+"更高效并且线程安全,StringBuilder比StringBuffer更快但不是线程安全),我想知道何时使用它们。
(重要提示:我知道它们之间的区别;这是一个与平台架构和一些设计决策有关的问题。)
String类被设计为不可变类(这个决定是经过深思熟虑的)。但是字符串连接非常慢,我自己进行了基准测试。因此,StringBuffer应运而生。这是一个非常好的类,它是同步的并且速度非常快。但是有些人对某些同步块的性能成本不满意,于是StringBuilder应运而生。
但是,当使用String连接不太多的对象时,该类的不可变性使其成为实现线程安全的一种非常自然的方式。我可以理解在我们想要管理多个字符串时使用StringBuffer。但是,这里是我的第一个问题:
1. 如果你有10个或更少的字符串要追加,你会为了执行时间中的几毫秒而牺牲简单性吗?
我也进行了StringBuilder的基准测试。它比StringBuffer更高效(只提高了10%)。但是,如果在单线程程序中使用StringBuilder,如果有时想要更改设计以使用多个线程,会发生什么情况?你必须更改每个StringBuilder实例,如果你忘记了其中一个,你将会产生一些奇怪的效果(由可能出现的竞争条件引起)。
2. 在这种情况下,你会为了调试几个小时而牺牲性能吗?
好的,这就是全部内容。除了简单的问题(StringBuffer比"+"更高效并且线程安全,StringBuilder比StringBuffer更快但不是线程安全),我想知道何时使用它们。
(重要提示:我知道它们之间的区别;这是一个与平台架构和一些设计决策有关的问题。)