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();

1496348-20190819231051023-1724190317.png

可以看到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

转载于:https://www.cnblogs.com/Vaxy/p/11380410.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值