StringStringBuffer和StringBuilder

Posted vaxy

tags:

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

String、StringBuffer和StringBuilder

String是java里一个常用类,关于String从源码中我们可以知道String是不可以有子类的。

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

String类由final修饰,是不能有子类的。

String实现了序列化接口(Serializable),预示着String对象是可序列化的。

另外还实现了Comparable和CharSequence接口。

String对象一旦初始化就不能再改变了,即使调用其字符拼接等方法,也只是拼接得到一个新的String对象。

虚拟机提供了一个字符串常量池,相同的字符串再常量池中只有一个,用到相同字符串时直接引用同意字符串常量。String类提供了一个intern方法可以将字符串加到常量池中,即使已经有同样的字符串。

String s1 = "str";
String s2 = "str";
String s3 = new String("str");
s3.intern();

技术图片

可以看到s1和s2引用的同一个字符串,而调用intern方法之后的s3引用的是另一个“str”。

在程序中频繁的拼接、修改、剪切字符串时,如果使用String类势必会在常量池中产生大量字符串,那就需要使用StringBufferStringBuilder了。

StringBufferStringBuilder是可修改的字符串类。这两个类都是继承于AbstractStringBuilder并实现了SerializableCharSequence接口,因此使用方法大体一致。

//StringBuffer中的append(String str)方法
@Override
public synchronized StringBuffer append(String str) 
    toStringCache = null;
    super.append(str);
    return this;

//StringBuilder中的append(String str)方法
@Override
public StringBuilder append(String str) 
    super.append(str);
    return this;

从源码中可以看到这两个方法类似,具体的操作都是调用父类的append方法。但是在两个类的源码对比中可以发现StringBuffer的大部分方法都有synchronized修饰而StringBuilder没有。

synchronized可以保证在同一时刻只有一个方法进入临界区,因此StringBuffer类时线程安全的,而StringBuilder线程不安全的。

在单线线程中StringBuffer和StringBuilder使用没有太大区别,而在多线程中使用StringBuffer更合适。

private int newCapacity(int minCapacity) 
        // overflow-conscious code
        int newCapacity = (value.length << 1) + 2;
        if (newCapacity - minCapacity < 0) 
            newCapacity = minCapacity;
        
        return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
            ? hugeCapacity(minCapacity)
            : newCapacity;
    

AbstractStringBuilder类中的方法。从这个方法可以看出字符数组的增长方式是**原大小*2+2**。

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

StringStringBuffer和StringBuild

StringStringBuffer和StringBuild

StringStringBuffer和StringBuild

StringStringBuffer和StringBuilder比较

StringStringBuffer和StringBuilder区别及性能分析

stringstringbuffer和stringbuilder的区别