浅谈Java中StringBuilder和StringBuffer的应用于差异

说起Java中StringBuilder和StringBuffer的应用于差异,StringBuilder是Java中的一个类,从定义上说他是一个可变字符序列,在功能上与StringBuffer较为接近,也是一个兼容性较好的API,经常在字符缓冲区和单线程中使用。StringBuilder的概念首先在C#中出现,后来被引入Java中;但在Java中本身具的功能相似的类是StringBuffer,功能在于对字符串进行存储和操作,他是一个可以更改的字符串变量。

下面对两者的区别进行比较:

在 StringBuilder 上的主要操作是 append 和 insert 两种方法,方法可重载,可接受的数据类型也没有限制。每重方法都能有效地将给定的数据转换成字符串,之后将该字符串的字符添加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端; insert 方法则在指定的点添加字符。例如,如果 z 引用一个当前内容为“start”的字符串生成器对象,则该方法调用 z.append(“le”) 将使字符串生成器包含“startle”,而 z.insert(4, “le”) 将更改字符串生成器,使之包含“starlet”。 尚学堂•百战程序员提示,每个字符串生成器都有一定的容量。当字符串生成器所包含的字符序列的长度未能超出容量,就不用分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,并且可以用于在无需创建一个新的字符串对象情况下修改字符串,则建议使用 StringBuffer。

String对象是不可改变的。每次使用 System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。前面讲过,String作为不可修改的对象,当对String修改会产生一个新的字符串对象,与之相对应的StringBuffer类的对象能够进行多次修改并且不会产生新的未使用的对象,因此在内存上要优于String对象。

关于StringBuffer对象的初始化,要注意不可将null直接赋予其中:

StringBuffer a=new StringBuffer()

这是初始化其为空值的正确写法,如果想要初始化具有初始值,则可通过:

StringBuffer a=new StringBuffer(‘abc’);

此时其初始值为abc

StringBuffer和String之间的相互转化,但对于StringBuffer而言不可直接强制类型转化。

关于两者的比较可以体现在执行速度方面,即StringBuilder执行速度要比 StringBuffer快。两者都是字符串变量,是可改变的对象,当我们用它们操作字符串,实际上是在一个对象上操作的,不需要和String一样创建一些对象进行操作,于是提升了速度。除此之外,StringBuilder是线程非安全的,而StringBuffer是线程安全的。字符串缓冲区被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。所以相比而言StringBuilder更适合单线程操作。

以上就是对Java中StringBuilder和StringBuffer的应用于差异的简要对比,希望能对你学Java有所帮助。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180327A0UYMP00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券