String、StringBuilder、StringBuffer的区别

String、StringBuilder、StringBuffer三者都实现了CharSequence接口,所以它们在使用中可以相互替换,但是内部的实现是不同的

String

String是不可变的对象,一旦创建就不能改变。String被存放在字符串常量池中,Java中每一个不可变对象都是线程安全的,所以String也是线程安全的。

String  demo = ” a ” ; // 对象被放在常量池中,它的值不能被修改
demo=”b” ;     //新的b字符串在常量池中创建,被demo变量引用,a字符串在常量池中仍然存在,它的值没有被修改,但是没有变量引用它

StringBuffer

StringBuffer是可变的,我们可以改变它的值。new StringBuffer创建的对象被放在堆中,StringBuffer和StringBuiler有相同的方法,但是StringBuffer的每个方法都有synchronized,所以StringBuffer是线程安全的

正因为如此,StringBuffer的方法不能被两个线程同时访问,所以StringBuffer在性能上不如StringBuilder。

StringBuilder

StringBuiler和StringBuffer相同,也是被存储在堆中,可以被修改,他们主要的不同就是StringBuilder不是线程安全的

通过下面的表格可以清晰的描述三者的区别

———————————————————————————-
  String                    StringBuffer         StringBuilder
———————————————————————————-
Storage Area | Constant String Pool           Heap                       Heap
Modifiable     |  No (immutable)            Yes( mutable )          Yes( mutable )
Thread Safe   |           Yes                                  Yes                              No
 Performance |         Fast                                Very slow                    Fast
———————————————————————————–

性能测试

[java]
public static void main(String[] args) {
int count = 50000;
long t;
String testString = "test";
{
String string = "";
t = System.currentTimeMillis();
for (int i = 0; i <= count; i++) {
string += testString;
}
System.out.println("String 耗时:" + (System.currentTimeMillis() – t));
}

{
StringBuffer stringBuffer = new StringBuffer();
t = System.currentTimeMillis();
for (int i = 0; i <= count; i++) {
stringBuffer.append(testString);
}
System.out.println("StringBuffer 耗时:" + (System.currentTimeMillis() – t));
}

{
StringBuilder stringBuilder = new StringBuilder();
t = System.currentTimeMillis();
for (int i = 0; i <= count; i++) {
stringBuilder.append(testString);
}
System.out.println("StringBuilder 耗时:" + (System.currentTimeMillis() – t));
}
}
[/java]

String 耗时:13297
StringBuffer 耗时:8
StringBuilder 耗时:1

使用场景

  • String:常量声明,少量的变量运算
  • StringBuffer:多线程中频繁的进行字符串操作
  • StringBuilder:不要求线程安全的频繁的进行字符串操作

(转载本站文章请注明作者和出处 JavaRanger – javaranger.com ,请勿用于任何商业用途)

本文链接: http://www.javaranger.com/archives/1949 

12条评论

  1. 小易分享网说道:

    谢谢博主分享,很实用! 欢迎回访:http://www.3gwb.com

  2. 奇虎分享网说道:

    感谢分享 祝您开心快乐每一天!

  3. 奇虎分享网说道:

    感谢分享 祝您开心快乐每一天!

  4. 小易分享网说道:

    哎呦,不错哦!欢迎互访,诚交友链! http://www.xevip.cn

  5. 小易分享网说道:

    哎呦,不错哦!欢迎互访,诚交友链! http://www.xevip.cn

  6. 安卓版一键转发http://www.qiangubuxiu.com/

  7. 广东硅谷学院说道:

    通俗易懂

  8. 美图共赏说道:

    美图在这里:http://www.fydzv.com/

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>