首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >String,StringBuffrer,StringBuilder 三兄弟

String,StringBuffrer,StringBuilder 三兄弟

作者头像
爱敲代码的猫
发布2019-10-17 11:30:36
发布2019-10-17 11:30:36
5350
举报
文章被收录于专栏:爱敲代码的猫爱敲代码的猫

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

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

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

StringBuilder > StringBuffer > String

String最慢的原因:

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

代码语言:javascript
复制
  String str = "aquan";
  System.out.println(str);
  str = str + "Meow";
  System.out.println(str);

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

代码语言:javascript
复制
  aquan
  aquanMeow

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

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

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

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

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

代码语言:javascript
复制
  String str = "aquan" + "Meow";
  StringBuilder stringBuilder = new StringBuilder().append("aquan").append("Meow");
  System.out.println(str);
  System.out.println(stringBuilder.toString());

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

代码语言:javascript
复制
  aquanMeow
  aquanMeow

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

代码语言:javascript
复制
  String str1 = "aquan";
  Stringstr2 = "Meow";
  Stringstr = str1 + str2;

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

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

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

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

说了那么多,下面总结下

  • String:适用于少量的字符串操作的情况下
  • StringBuilder:适用于 单线程 下字符缓冲区中进行大量操作的情况下
  • StringBuffer:适用于 多线程 下的字符缓冲区中镜像大量操作的情况下
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爱敲代码的猫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档