StringStringBufferStringBuilder区别

Posted 王小森

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了StringStringBufferStringBuilder区别相关的知识,希望对你有一定的参考价值。

1.三个类之间的关系

StringBuffer和StringBuilder都继承自AbstractStringBuilder这个类,而AbstractStringBuilder和String都继承自Object这个类

 

2.String是不可变类,而StringBuffer, StringBuilder是可变类

  我们查看这三个类的源码,String:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。源码中 private final char value[]; 因为value被final修饰,所以不可变

而StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。

3.性能(执行速度) 上对比

 一般而言在执行速度上,String < StringBuffer < Stringbuilder

3.1 String < StringBuffer

  这是因为String类是不可变的,即字符串常量,所以每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象。这就会对程序运行产生很大的影响,因为当内存中的无引用对象多了以后,JVM的GC进程就会进行垃圾回收,这个过程会耗费很长一段时间,因此经常改变内容的字符串最好不要用 String类的对象。而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。比如

String s1 = "a";

String s2 = "b";

String s3 = "c";

String string = s1 + s2 + s3;  

3.2 StringBuffer< StringBuilder

这时候使用StringBuilder的运行速度更快,但是因为StringBuffer中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而StringBuilder是非线程安全,加锁会降低性能,所以速度上StringBuilder > StringBuffer

3.3 特殊情况String最快

但是有些情况string的速度比stringbuilder快,那就是在编译时期产生的优化,比如:

String s = "a"+"b"+"c";  

 在编译的时候会优化成String  s="abc"; 此时快于StringBuilder的append方式

 

  

以上是关于StringStringBufferStringBuilder区别的主要内容,如果未能解决你的问题,请参考以下文章