转载

String,StringBuffrer,StringBuilder 三兄弟

Java

String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String、StringBuilder和StringBuffer这几个类,分析它们的异同点以及了解各个类适用的场景。

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

  1. 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:

StringBuilder > StringBuffer > String

String最慢的原因:

String为字符串 常量 ,而StringBuilder和StringBuffer均为字符串 变量 ,既String对象一旦创建后该对象是不可以更改的,但是后两者StringBuilder和StringBuffer的对象是变量,是可以更改的。下面举个栗子:

String str = "aquan";
   System.out.println(str);
   str = str + "Meow";
   System.out.println(str);

​ 运行这段代码的运行结果如下:

aquan
   aquanMeow

这样看起来好像是 str 这个对象被更改了,其实,这只是一个假象,JVM对于这几行代码是这样处理的:

  • 首先创建一个String对象str,并且把”aquan“赋值给str
  • 然后在第三行中,其实JVM又创建一个新对象也名为str
  • 然后再把原来的str的值和“Meow”加起来再赋值给新的str
  • JVM然后就会把原来的str回收掉(垃圾回收机制)

所以,str实际上是并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。

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

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

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

这段代码的运行结果如下:

aquanMeow
   aquanMeow

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

String str1 = "aquan";
   String str2 = "Meow";
   String str = str1 + str2;

那么JVM就会像上面说的那样,不断的创建,回收对象来进行这个操作,这样速度就会很慢了。

  1. 那么现在从线程安全来看看着三兄弟的区别

StringBuilder是线程不安全的,而String和StringBuffer是线程安全的

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

  1. 说了那么多,下面总结下
  • String:适用于少量的字符串操作的情况下

  • StringBuilder:适用于 单线程 下字符缓冲区中进行大量操作的情况下

  • StringBuffer:适用于 多线程 下的字符缓冲区中镜像大量操作的情况下

文章会同步更新到微信公众号和小程序哦

可以关注微信公众号:爱敲代码的猫

String,StringBuffrer,StringBuilder 三兄弟

本文由Aquan 创作,采用 知识共享署名4.0 国际许可协议进行许可

本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名

最后编辑时间为: 三月 23,2019

原文  https://blog.eunji.cn/archives/1553270895347
正文到此结束
Loading...