String, StringBuffer, StringBuilder的区别

原创 2018年04月17日 16:45:08

这三个类的主要区别是在于两个方面,即 运行速度线程安全

String源码说明:constant; values cannot be changed after they are created

* Strings are constant; their values cannot be changed after they
* are created. String buffers support mutable strings.
* Because String objects are immutable they can be shared. For example:
* <blockquote><pre>
*     String str = "abc";
* </pre></blockquote><p>
* is equivalent to:
* <blockquote><pre>
*     char data[] = {'a', 'b', 'c'};
*     String str = new String(data);
* </pre></blockquote><p>
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

StringBuffer源码说明:thread-safe, can be modified

* A thread-safe, mutable sequence of characters.
* A string buffer is like a {@link String}, but can be modified. At any
* point in time it contains some particular sequence of characters, but
* the length and content of the sequence can be changed through certain
* method calls.
/**
 * Constructs a string buffer with no characters in it and an
 * initial capacity of 16 characters.
 */
public StringBuffer() {
    super(16);
}

StringBuilder源码说明:with no guarantee of synchronization

* A mutable sequence of characters.  This class provides an API compatible
* with {@code StringBuffer}, but with no guarantee of synchronization.
* This class is designed for use as a drop-in replacement for
* {@code StringBuffer} in places where the string buffer was being
* used by a single thread (as is generally the case).   Where possible,
* it is recommended that this class be used in preference to
* {@code StringBuffer} as it will be faster under most implementations.
/**
 * Constructs a string builder with no characters in it and an
 * initial capacity of 16 characters.
 */
public StringBuilder() {
    super(16);
}

从源码的说明中我们可以看到,String为字符串常量,即String对象一旦创建之后该对象是不可更改的。而StringBuilder和StringBuffer均为字符串变量,后两者的对象是变量,是可以更改的。StringBuffer是线程安全的。

在运行速度或者说执行速度方面

结果为 StringBuilder > StringBuffer > String

String str="abc";

System.out.println(str);
str=str+"de";
System.out.println(str);

如果运行这段代码会发现先输出“abc”,然后又输出“abcde”,好像是str这个对象被更改了,其实,这只是一种假象罢了,JVM对于这几行代码是这样处理的:

首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。

     而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。

     另外,有时我们会这样对字符串进行赋值:

String str="abc"+"de";
StringBuilder stringBuilder=new StringBuilder().append("abc").append("de");
System.out.println(str);
System.out.println(stringBuilder.toString());

这样输出结果也是“abcde”和“abcde”,但是String的速度却比StringBuilder的反应速度要快很多,这是因为第1行中的操作和
  String str="abcde";
  是完全一样的,所以会很快,而如果写成下面这种形式

String str1="abc";
String str2="de";
String str=str1+str2;
那么JVM就会像上面说的那样,不断的创建、回收对象来进行这个操作了。速度就会很慢。


再来说说线程安全

在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的

 如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

总结一下:

  String:适用于少量的字符串操作的情况
  StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
  StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

String、StringBuilder和StringBuffer的区别

  • 2011年06月09日 09:19
  • 55KB
  • 下载

String,StringBuffer,StringBuilder个人认为较重要的区别

今天在整理不可变对象知识点时,突然看到了String,StringBuffer,StringBuilder三者的区别,这里就挑一些我认为比较重要的点记录一下,方便日后查看。     String...
  • u010758939
  • u010758939
  • 2017-02-06 15:23:05
  • 697

String、Stringbuffer与Stringbuilder的区别

1、在执行速度上:Stringbuilder->Stringbuffer->String 2、String是字符串常量       Stringbuffer是字符串变量       String...
  • u011247942
  • u011247942
  • 2017-06-22 15:03:43
  • 3192

JAVA之String,StringBuffer与StringBuilder三者之间的区别

JAVA之String,StringBuffer与StringBuilder三者之间的区别
  • mmd0308
  • mmd0308
  • 2017-06-16 16:37:55
  • 821

String,StringBuffer,StringBuilder 三者之间的区别是什么?

1.String 字符串产量 2.StringBuffer 字符串变量(线程安全) 3.StringBuilder 字符串变量 (非线程安全) 1.String类型,是java内的对象,...
  • qq_30278639
  • qq_30278639
  • 2016-05-10 14:09:35
  • 1037

StringBuffer与StringBuilder之间的区别

public class Test { public static void main(String[] args) { StringBuffer strBuffer = new StringB...
  • a19881029
  • a19881029
  • 2014-03-02 13:25:38
  • 5783

Java基础之String、StringBuffer与StringBuilder的区别及应用场景

1 String、StringBuffer与StringBuilder区别 (1)区别 String内容不可变,StringBuffer和StringBuilder内容可变; StringBui...
  • chenliguan
  • chenliguan
  • 2016-07-14 18:35:39
  • 7809

StringBuilder的用法及String,StringBuffer与StringBuilder的区别

  声明:本文大部分内容为参考别人的,自己简单汇总整理了一下。   String 字符串常量   StringBuffer 字符串变量(线程安全)   StringBuilder 字符串变量(非...
  • u011489043
  • u011489043
  • 2017-03-30 15:33:43
  • 996

java中string stringbuffer和stringBuilder区别

一直想做这3个之间的区别,当我们在开发过程中一般好少去考虑这些 1.在执行效率方面比较:stringbuilder > stringbuffer 2.stringbuffer 与 stringBuil...
  • u014209975
  • u014209975
  • 2016-09-20 12:07:58
  • 484

Java中String、StringBuffer、StringBuilder简述及区别

容我喝杯82年的Java压压惊~~~如有欢迎指正。 1.String:由多个字符组成的一串数据,相当与...
  • MAGIC_JSS
  • MAGIC_JSS
  • 2016-05-10 23:35:30
  • 1608
收藏助手
不良信息举报
您举报文章:String, StringBuffer, StringBuilder的区别
举报原因:
原因补充:

(最多只允许输入30个字)