String、StringBuffer、StringBuilder的区别

三者的继承结构


String

        String是可不变的字符串,它是用final修饰的字符数组来保存字符串.

        String 不是基本数据类型,是引用类型,底层用 char 数组实现的.

        字符串广泛应用在Java 编程中,在 Java 中字符串属于,Java 提供了 String类来创建操作字符串.

        要注意的是,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间.我们来看一下这张对String操作时内存变化的图:

         我们可以看到,初始String值为"hello",然后在这个字符串后面加上新的字符串"world",这个过程是需要重新在栈堆内存中开辟内存空间的,最终得到了"hello world"字符串也相应的需要开辟内存空间,这样短短的两个字符串,却需要开辟三次内存空间,不得不说这是对内存空间的极大浪费.为了应对经常性的字符串相关的操作,就需要使用Java提供的其他两个操作字符串的类——StringBuffer类和StringBuild类来对此种变化字符串进行处理.

StringBuffer和StringBuilder

        StringBuilder和 StringBuffer都继承自AbstractStringBuilder类.

        在AbstractStringBuilder中也是使用字符数组保存字符串,但是没有用 final关键字修饰,所以这两种对象都是可变的.

        字符[]值

1.线程安全

StringBuffer:线程安全

StringBuilder:线程不安全

因为StringBuffer的所有公开方法都是synchronized修饰的

而StringBuilder并没有StringBuilder 修饰

2.缓冲区

StringBuffer 每次获取 toString 都会直接使用缓存区的 toStringCache 值来构造一个字符串

StringBuilder 则每次都需要复制一次字符数组,再构造一个字符串

这也是对 StringBuffer 的一个优化,但StringBuffer 的这个toString 方法仍然是同步的

3.性能

StringBuffer 是线程安全的,它的所有公开方法都是同步的

StringBuilder 是没有对方法加锁同步的

所以毫无疑问,StringBuilder 的性能要远大于 StringBuffer

4.总结

StringBuffer 适用于用在多线程操作同一个 StringBuffer 的场景

如果是单线程场合StringBuilder 更适合


三者的区别

  • StringBuilder和StringBuffer非常类似,均代表可变的字符序列,而且方法也一样
  • String:不可变字符序列
  • StringBuffer:可变字符序列、效率低、线程安全
  • StringBuilder(JDK1.5):可变字符序列、效率高、线程不安全
  • String的使用陷阱

String s = "a"; //创建了一个字符串

s = s + "b";     //实际上原来的"a"字符串对象已经丢弃了,现在又产生了一个字符串s + "b"(也就是"ab").如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率.如果这样的操作放到循环中,会极大影响程序的性能.

三者使用的总结

1.操作少量的数据:适用String.

2.单线程操作字符串缓冲区下操作大量数据:适用StringBuilder.

3.多线程操作字符串缓冲区下操作大量数据:适用StringBuffer.


StringStringBufferStringBuilder
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量可变类,速度更快
不可变字符序列可变字符序列变可变字符序列
线程安全线程不安全

多线程操作字符串

单线程

转载自图析:String,StringBuffer与StringBuilder的区别_Chin_style的博客-CSDN博客_string stringbuffer stringbuilder区别,感谢整理和分享!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值