Java解释:为什么String immutable使StringBuffer更高效

时间:2012-03-28 03:23:07

标签: java string immutability stringbuffer

我在Java书中读过:

  

由于String是不可变的,因此使用StringBuffer会更有效。

我知道String个实例是不可变的。

我也理解StringBuffer使得处理字符串比正常情况更有效。

但我无法解决的问题是连接这两个概念的原因,即String如何成为不可变的帮助StringBuffer

谢谢:)

5 个答案:

答案 0 :(得分:8)

因为字符串是不可变的,要操纵字符串,例如连接字符串,你必须创建新的String对象,因为很明显,你不能改变现有String对象的状态。而使用StringBuffer或StringBuilder,您可以创建一个对象,只需更改其状态即可。例如,如果你在for循环中进行一些主要的字符串连接,那么这个对象的创建会变得非常昂贵。

话虽如此,我看到很多帖子都批评了不涉及大规模串联的简单字符串连接,并且在那种情况下使用StringBuffer或StringBuilder是过早和不必要的优化的一个例子。

另请注意,除非您的应用程序需要在多个线程中访问该对象,并且不介意这会产生额外的开销,否则您应该优先使用StringBuilder而不是StringBuffer。

答案 1 :(得分:2)

它的意思是,因为String是不可变的,所以最好使用StringBuffer(或StringBuilder)进行字符串操作,因为每次更改底层字符串时都不会创建新对象。

答案 2 :(得分:1)

所有其他帖子肯定回答了这个问题。我想补充一点,您应该始终选择StringBuilder而不是StringBufferStringBuffer具有内置的线程同步,这是一个你几乎不需要的大量锁定开销。 StringBuilder没有这个,因此更快。

事实上,即使你想要线程安全,some very good reasons也不要使用StringBuffer

答案 3 :(得分:1)

  

但我无法解决的是连接这两个概念的原因,即String如何不可变帮助StringBuffer?

没有。我认为你只是误解了你所引用的句子。

  

“因为String是不可变的,所以使用StringBuffer会更有效。”

这就是说StringBuffer是一个相对更有效的选项(对于某些任务)。换句话说:“因为String是不可变的,所以使用StringBuffer比使用String执行某些任务更有效。”。

并不是说StringBuffer绝对值比String不可变时更快。当然,这不是我读报价的方式......也不是一个真实的陈述。

答案 4 :(得分:0)

使用此示例

可以很容易地解释不可变的概念
String s1 = "Hello";
String s2 = "Hi";
String s3 = "Hello";

if (s1 == s2){ System.out.println("s1==s2");}
if (s1 == s3){ System.out.println("s1==s3");}

s1 = "Hi";

if (s1 == s2){ System.out.println("s1==s2");}
if (s1 == s3){ System.out.println("s1==s3");}

如果你执行这段代码,你会得到 s1==s3s1==s2。这个例子解释了什么?

当你创建了s1时,编译器在其字符串表中创建了一个字符串“Hello”(我记得它的确切名称)。创建s2时,它会创建新对象“Hi”。现在当你创建了s3时,编译器知道它的字符串表中已经存在一个对象“Hello”,所以为什么不直接将s3引用到它。所以s1 = s3(记忆虎钳)。当您为s1指定值“hi”时也发生了相同的情况,编译器可以看到“hi”已经在s3指向的内存中,因此它也将其指向s1。

在StringBuffer的情况下,Compiler为对象分配内存,你可以操作而不是像String一样“池”。