Java基础-String、StringBuilder、StringBuffer

String、StringBuilder、StringBuffer虽然都与Java的字符串有关,但是它们之间存在一定地区别。

一  String是字符串常量,而StringBuilder、StringBuffer是字符串变量

String对象在创建之后时候不可变的,这种不可变造成了在对String实施改变操作时,JVM会重新创建一个String对象。

String s="qwe";// 1
System.out.println(s);  //2
s=s+"as";// 3
System.out.println(s);  //4

例如,上面这段代码,第1步对s赋值,在第3步想对s追加字符串,这时JVM会新建一个字符串qweas,而第1步的“qwe”会被GC回收。因此,如果对String对象频繁的进行修改,速度很慢且造成内存浪费。

StringBuilder、StringBuffer对象都是变量,它们都继承自AbstractStringBuilder。对于二者的append()方法,内部实现使用的是System.arraycopy()方法,因此改变对象值的时候不需要重建,速度上更快。

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

 public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
public AbstractStringBuilder append(char[] str) {
        int len = str.length;
        ensureCapacityInternal(count + len);
        System.arraycopy(str, 0, value, count, len);
        count += len;
        return this;
    }

二  线程安全性

这里主要强调的是StringBuilder和StringBuffer。StringBuilder是线程不安全的,而StringBuffer是线程安全的,StringBuffer里的方法均由synchronized修饰,保证了安全。因此在多线程的场景里,使用StringBuffer,否则使用StringBuilder。

总结如下:

String适用于对字符串修改较少的场景

StringBuffer适合多线程频繁修改字符缓冲区的场景

StringBuilder适合单线程频繁修改字符缓冲区的场景

猜你喜欢

转载自blog.csdn.net/u011063112/article/details/81148157