String Stringbuilder 和StringBuffer的区别

以前看java的面试题总共有让人说 String StringBuilder 和StringBuffer的区别。今天就详细的记录一下。

首先是String :其中String类型的源码实际上是一个数组 private final char value[]; 由final修饰,所以String类型不可以更改。String 是在堆上创建字符串对象的。 编译器会将字符串添加到常量池中 并返回指向该常量的引用。如果我们创建了新的String,先会在常量池中寻找,如果存在在直接将引用指向字符串,不存在就新生成一个。

String s0 = "abc"; 
String s1 = "abc"; 
System.out.println(s0==s1); //true  可以看出s0和s1是指向同一个对象的。
因为String 是常量 ,所以线程是安全的。

接下来是StringBuilder 和 StringBuffer 都 继承了AbstractStringBuilder
在AbstractStringBuilder中 使用的也是数组,只不过没有用final来修饰 char[] value;
相对于StringBuilder 来说,StringBuffer 在方法中加了同步锁。所以是线程安全的。StringBuilder 没有加同步锁,所以是线程不安全的。


其次 StringBuilder和StringBuffer每次都是对对象本身进行操作,而不是像String一样创建一个新的对象引用。速度就要快很多,而对于StringBuilder和StringBuffer而言,作为StringBuffer因为加了锁
的缘故,所以性能要比StringBuilder 慢上一些。


原文地址:https://www.cnblogs.com/xiaosisong/p/10830583.html