Java基础知识之String、StringBuilder和StringBuffer三者的区别

String、StringBuilder和StringBuffer这三个类在操作字符串时主要有运行速度和线程安全这两方面的区别:

1.运行速度

  运行速度,即执行字符串操作时代码执行的时间快慢,在这方面运行速度快慢为:StringBuilder > StringBuffer > String。   String最慢的原因:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。以下面一段代码为例:

String str="abc";
System.out.println(str);//输出“abc”
str=str+"de";
System.out.println(str);//输出“abcde”

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

String str="abc"+"de";
StringBuilder stringBuilder=new StringBuilder().append("abc").append("de");
System.out.println(str);// 输出是“abcde”
System.out.println(stringBuilder.toString());// 输出是“abcde”

  String的速度却比StringBuilder的反应速度要快很多,这是因为第1行中的操作和String str="abcde";是完全一样的,所以会很快。
  结论:对于常量的字符串来说,应该选用String,对于可变的字符串操作应该选用高效的StringBuilder或StringBuffer。

2.线程安全

  StringBuilder是线程不安全的,而StringBuffer是线程安全的。
  由于StringBuffer中很多方法可以带有synchronized关键字,一个StringBuffer对象在字符串缓冲区被多个线程使用时,可以保证线程是安全的,但StringBuilder的方法没有该关键字,所以不能保证线程安全。所以如果要进行的操作是多线程的,应该优先使用StringBuffer,但是在单线程的情况下,优先使用速度比较快的StringBuilder。

3. 适用场景

  结合String、StringBuilder以及StringBuffer的区别,我们可以得出三者的适用场景如下:
  (1)、String:适用于不对字符串进行操作和对字符串进行少量操作的场景;
  (2)、StringBuilder:适用于单线程下在字符缓冲区进行大量字符操作的场景;
  (3)、StringBuffer:适用多线程下在字符缓冲区进行大量字符操作的场景。

猜你喜欢

转载自blog.csdn.net/Alexlee1986/article/details/81142712