String和StringBuilder和StringBuffer的区别

图解:

String和StringBuilder和StringBuffer的区别

 String字符串在拼接的时候的首先会创建一个StringBuilder对象,其次调用StringBuilder的append()方法,最后调用StringBuilder的toString()方法返回给String变量,但是这样循环的时候会产生多个对象。

 

这三个类的主要区别在两个方面:运算速度(运算性能或执行效率)和线程安全性。

1、运算速度比较(通常情况下):StringBuilder > StringBuffer > String

String是final类不能被继承且为字符串常量,而StringBuilder和StringBuffer均为字符串变量。String对象一旦创建便不可更改,而后两者是可更改的,它们只能通过构造函数来建立对象,且对象被建立以后将在内存中分配内存空间,并初始保存一个null,通过append方法向StringBuffer和StringBuilder中赋值。

而StringBuilder和StringBuffer的对象是变量,对变量的操作是直接对该对象就行更改,因此不会进行反复的创建和回收。所以在运行速度上比较快。

 

2. 线程安全性

StringBuilder(非线程安全)

而StringBuilder的方法没有该关键字修饰,所以不能保证线程安全性。是JDK1.5新增的,该类提供一个与StringBuffer兼容的 API,但不能保证同步,所以在性能上较高。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

StringBuffer(线程安全的)

StringBuffer中大部分方法由synchronized关键字修饰,在必要时可对方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致,所以是线程安全的。类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

3. 注:

  • String:适用于少量的字符串操作。
  • StringBuilder:适用于单线程下在字符串缓冲区进行大量操作。
  • StringBuffer:适用于多线程下在字符串缓冲区进行大量操作。
     

 

String和StringBuilder和StringBuffer的区别

 

 

 

 

 

 

 

相关文章: