Java基础——String、StringBuffer、StringBuilder区别

String 字符串常量:
简单来说,String类型和StringBuffer类型主要区别是:String是不可变对象。
每次对String类型进行改变的时候其实都等同于生成了一个新的String对象,然后指针再指向新对象。
所以经常改变内容的字符串最好不用String,因为每次生成新对象都会对系统性能产生影响,当无引用对象
多了以后,JVM的GC就会开始工作。


StringBuffer 字符串变量(线程安全):

改变内容对于StringBuffer来说只是对对象本身进行操作。大部分情况下StringBuffer速度大于String。

线程安全实现原理:

//下面只是节选一些StringBuffer中的函数
synchronized StringBuffer     append(char ch)
synchronized StringBuffer     append(char[] chars)
synchronized StringBuffer     append(char[] chars, int start, int length)
synchronized StringBuffer     append(Object obj)
synchronized StringBuffer     append(String string)
synchronized StringBuffer     append(StringBuffer sb)
synchronized StringBuffer     append(CharSequence s)
synchronized StringBuffer     append(CharSequence s, int start, int end)
synchronized StringBuffer     insert(int index, char ch)
synchronized StringBuffer     insert(int index, char[] chars)
synchronized StringBuffer     insert(int index, char[] chars, int start, int length)
synchronized StringBuffer     insert(int index, String string)
都使用了synchronized关键字保证同步。

StringBuilder 字符串变量(非线程安全):
是5.0新增的方法,设计用于对StringBuffer的简易替换,使用方法和StringBuffer基本相同,
缺点是非线程安全
优点是比StringBuffer要快,因为没有使用synchronized同步。

所以,如果可以尽量使用StringBuilder。


从类的定义看CharSequence、StringBuffer、StringBuilder、String的关系

CharSequence是一个定义字符串操作的接口,StringBuffer、StringBuilder、String中都实现了这个接口.

//CharSequence定义
public interface CharSequence


//StringBuffer定义
 public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence

//StringBuilder定义
public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence

//String定义
public final class String
    implements
java.io.Serializable, Comparable<String>, CharSequence

猜你喜欢

转载自blog.csdn.net/wy_is_learning/article/details/79428053
今日推荐