13. String、StringBuffer与StringBuilder的区别。

来源:互联网 发布:axure8中文破解版 mac 编辑:程序博客网 时间:2024/06/06 16:27

String类(字符串常量,线程安全)

String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。

字符串是一个常量,创建好之后,存储到字符串缓存池之中,不能再进行修改。

字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享

在这里需要注意的是,每次使用String的对象时,每次更改其实只是创建一个新的String对象,名字不更改而已,引用地址还有内存指向全都发生了改变,而旧的对象就被回收掉了。这样导致性能下降,增加GC回收的次数,降低效率。



StringBuffer(字符串变量,线程安全)

StringBuffer是一个可变的字符串类,可以通过apped,insert等方法增加或修改,而发生改变的永远都是自己本身的对象.

如果 z 引用一个当前内容为 “start” 的字符串缓冲区对象,则此方法调用 z.append(“le”) 会使字符串缓冲区包含 “startle”,而 z.insert(4, “le”) 将更改字符串缓冲区,使之包含 “starlet”。

每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。



StringBuilder(字符串变量,线程不安全)

一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。  


对于三者使用的总结: 1.如果要操作少量的字符串数据用String

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

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


一般来说 执行时间上从快到慢 StringBuilder、StringBuffer、String

非多线程操作字符串缓冲区建议使用 StringBuilder。