java中String StringBuilder StringBuffer比较和效率(性能)测试

本文探讨了Java中String、StringBuilder和StringBuffer的区别,主要从源码角度出发,分析它们的可变性和内存管理。通过性能测试发现,尽管StringBuffer在多线程环境下具有线程安全性,但在单线程大量拼接操作中,StringBuilder在达到一定数量级后表现出更高的性能优势。

string stringbuilder stringbuffer三者的区别

从JDK源码看,String、StringBuilder、StringBuffer都是存放在char[] 数组字符串。
简单看下三者的部分源码:
String定义属性和构造方法:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
   
   
   
    private final char value[];
 public String() {
   
   
        this.value = "".value;
    }    
    public String(String original) {
   
   
        this.value = original.value;
        this.hash = original.hash;
    }

    public String(char value[]) {
   
   
        this.value = Arrays.copyOf(value, value.length);
    }

StringBuilder源码:

public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{
   
   

   
    public StringBuilder() {
   
   
        super(16);
    }

    public StringBuilder(int capacity) {
   
   
        super(capacity);
    }


    public StringBuilder(String str) {
   
   
        super(str.length() + 16);
        append(str);
    }

StringBuffer源码:

public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{
   
   

    private transient char[] toStringCache;
 
    public StringBuffer() {
   
   
        super(16);
    }

比较明显的是:
String 中定义的char[] 数组是用final 修饰,所以,String 是不可变字符序列,而StringBuilder和StringBuffer是可变字符序列;
如果Sting 需要改变则需要重新创建新对象;
StringBuffer 和 StringBuilder 都继承 AbstractStringBuilder类,他们在初始化时,都是调用父类的构造器。

接下来,我们在简单看下AbstractStringBuilder类源码:

abstract class AbstractStringBuilder implements Appendable, CharSequence {
   
   
    /**
     * The value is used for character storage.
     */
    char[] value;

    /**
     * The count is the number of characters used.
     */
    int count;

    /**
     * This no-arg constructor is necessary for serialization of subclasses.
     */
    AbstractStringBuilder() {
   
   
    }

    /**
     * Creates an AbstractStringBuilder of the specified capacity.
     */
    AbstractStringBuilder(int capacity) {
   
   
        value = new char[capacity];
    }

可以看到 AbstractStringBuilder 其实也定义了char[] 数组,不同的是,AbstractStringBuilder 中的char[] 数组可以可变的,在细看一点,可以看到AbstractStringBuilder 有扩容的方法:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值