我在Java书中读过:
由于
String
是不可变的,因此使用StringBuffer
会更有效。
我知道String
个实例是不可变的。
我也理解StringBuffer
使得处理字符串比正常情况更有效。
但我无法解决的问题是连接这两个概念的原因,即String
如何成为不可变的帮助StringBuffer
?
谢谢:)
答案 0 :(得分:8)
因为字符串是不可变的,要操纵字符串,例如连接字符串,你必须创建新的String对象,因为很明显,你不能改变现有String对象的状态。而使用StringBuffer或StringBuilder,您可以创建一个对象,只需更改其状态即可。例如,如果你在for循环中进行一些主要的字符串连接,那么这个对象的创建会变得非常昂贵。
话虽如此,我看到很多帖子都批评了不涉及大规模串联的简单字符串连接,并且在那种情况下使用StringBuffer或StringBuilder是过早和不必要的优化的一个例子。
另请注意,除非您的应用程序需要在多个线程中访问该对象,并且不介意这会产生额外的开销,否则您应该优先使用StringBuilder而不是StringBuffer。
答案 1 :(得分:2)
它的意思是,因为String是不可变的,所以最好使用StringBuffer(或StringBuilder)进行字符串操作,因为每次更改底层字符串时都不会创建新对象。
答案 2 :(得分:1)
所有其他帖子肯定回答了这个问题。我想补充一点,您应该始终选择StringBuilder
而不是StringBuffer
。 StringBuffer
具有内置的线程同步,这是一个你几乎不需要的大量锁定开销。 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==s3
和s1==s2
。这个例子解释了什么?
当你创建了s1时,编译器在其字符串表中创建了一个字符串“Hello”(我记得它的确切名称)。创建s2时,它会创建新对象“Hi”。现在当你创建了s3时,编译器知道它的字符串表中已经存在一个对象“Hello”,所以为什么不直接将s3引用到它。所以s1 = s3(记忆虎钳)。当您为s1指定值“hi”时也发生了相同的情况,编译器可以看到“hi”已经在s3指向的内存中,因此它也将其指向s1。
在StringBuffer的情况下,Compiler为对象分配内存,你可以操作而不是像String一样“池”。