码迷,mamicode.com
首页 > 其他好文 > 详细

String、StringBuffer和StringBuilder

时间:2019-08-20 01:13:38      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:enc   接口   方法   new   使用   大小   安全   zed   常用类   

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**。

String、StringBuffer和StringBuilder

标签:enc   接口   方法   new   使用   大小   安全   zed   常用类   

原文地址:https://www.cnblogs.com/Vaxy/p/11380410.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!