String、StringBuilder、StringBuffer区别

String、StringBuilder、StringBuffer区别

总结

  1. String的值是final,不可变的,每次操作String都会生成新的String对象,不仅效率低,而且浪费大量的内存空间
  2. StringBuffer 和 StringBuiler 都是继承 AbstractStringBuilder 类,
  3. StringBuffer 重写了 AbstractStringBuilder 的所有操作方法 加上了 synchronized 关键字 和 toStringCache 缓冲区 ,使得StringBuffer所有操作方法变为了同步方法,变为了线程安全的字符串操作类,字符数据未变化时,多次使用toString时可以直接获取缓存数据,toStringCache变量使用 transient 关键字修饰 ,不会被系列化;速度快
  4. StringBuilder 基本操作都是直接使用 AbstractStringBuilder 父类方法; 线程操作不安全 ,速度更快

字符串操作

  • String

    String a = "123";
    a = "456";
    

    从代码就能看出,String 类型给变量赋值实际上是重新创建了一个对象String

  • StringBuffer

    StringBuffer stringBuffer = new StringBuffer();
    stringBuffer.append("123");
    private transient String toStringCache;
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }
    

    StringBuffer内部调用的实际上 是父类 AbstractStringBuilder 中的append 方法, 直接对char[] 操作。只是在此基础上 增加了 synchronized 关键字 和 toStringCache 缓冲区的操作

    toStringCache 缓冲区 也只是用在toString() 方法上面

    public synchronized String toString() {
    	if (toStringCache == null) {
    		return toStringCache =
    			isLatin1() ? StringLatin1.newString(value, 0, count)
     			: StringUTF16.newString(value, 0, count);
    	}
    	return new String(toStringCache);
    }
    
  • StringBuilder

    StringBuilder stber = new StringBuilder();
    stber.append("123");
    
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
    

    StringBuilder内部调用的实际也上 是父类 AbstractStringBuilder 中的append, 直接对char[] 操作。并且没有 synchronized 关键字 也没有 toStringCache 缓冲区

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值