暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

String/StringBuilder/StringBuffer的区别与用法

猿生物语 2019-10-17
266

Java中关于字符串最常见的三种存储形式是:String
StringBuffer
StringBuilder
。它们都是对象,而非基本数据类型(这一点要注意)。


其中,String
是最常见的一种用于定义和存储字符串的形式。


下面我们将分析一下这三种Object的区别和使用场景。

首先我们看一下这三个类的源码:


源码

public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {

private final char value[];

// ...
}


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

//...

@Override
public synchronized int length() {
return count;
}

//...
}


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

//...

@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}


//...
}


abstract class AbstractStringBuilder implements Appendable, CharSequence {
char[] value;
}


从上可以看出,StringBuilder和StringBuffer同出一源——都继承自AbstractStringBuilder这个抽象类。


三者的区别

从源码可以发现,String、StringBuilder、StringBuffer都是用char数组来存储String的。三者之间的区别在于:


  1.  String
    利用final char[]
    存储数据,而另外两者则是char[]
    。这意味着String是不可变的,而StringBuilder
    StringBuffer
    则是可变的。

  2. 从线程安全性上看:String是常量,那就是线程安全的。StringBuilder的方法没有加同步锁,而StringBuffer的对方法加了同步锁,所以StringBuilder是非线程安全的

  3. 从性能上看,String发生改变时,总会创建新的String对象,而后将指针指向这个新的String对象。而java的垃圾收集是通过JVM的GC进行的,这样就导致假如下一次GC还未启动,已经产生了大量的不再被使用的String对象,那么就会大大影响到系统性能。

    StringBuilder和StringBuffer都是对对象本身进行操作的,所以不会造成性能问题。相同情况下,使用StringBuilder比StringBuffer能获得10%~15%的性能提升,但有可能会造成线程不安全问题。


三者的使用情况

总结String、StringBuilder和StringBuffer的使用情况:

  1. 在单线程情况下,如果字符串change操作较少,建议使用String。如果change操作较多,建议使用StringBuilder——在idea开发环境中,如在一个for循环中连接字符串,会自动提示应该使用StringBuilder的append而不是String本身

  2. 在多线程情况下,如果字符串change操作较少,同样使用String。否则建议使用StringBuffer。


实际使用:

  在接口中通常用String即可;多线程且字符串拼接等操作较多时,建议用StringBuffer。

文章转载自猿生物语,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论