String StringBuilder和StringBuffer的区别

转载整理于[https://www.cnblogs.com/su-feng/p/6659064.html],非常感谢!
  这是面试中常问到的问题,也是开发中需要熟悉的内容。
  总的来讲,他们的区别主要体现在两方面:
一、运行速度
  StringBuilder > StringBuffer > String
  String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。

String str="abc";
System.out.pringln(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对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程。
  在大量的string拼接操作出现的时候,JVM由于内存紧张,基本实时进行gc,引起速度变慢。
  而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
  再看下面的代码:

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

运行结果都市“abcde”。但此时1比2快,主要是
这里第1行和

String str="abcde";

的运行速度是一样的,此时String没有对象的创建和回收,所以快。

二、线程安全
  线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时进行保护,直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
  线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。
  StringBuilder是线程不安全的,而StringBuffer是线程安全的
  如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
  
S t r i n g : 适 用 于 少 量 的 字 符 串 操 作 的 情 况 \color{red}{String:适用于少量的字符串操作的情况} String

S t r i n g B u i l d e r : 适 用 于 单 线 程 下 在 字 符 缓 冲 区 进 行 大 量 操 作 的 情 况 \color{red}{StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况} StringBuilder线

S t r i n g B u f f e r : 适 用 多 线 程 下 在 字 符 缓 冲 区 进 行 大 量 操 作 的 情 况 \color{red}{StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况} StringBuffer线

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值