String,StringBuffer和StringBuilder的区别

来源:互联网 发布:上海软件开发有限公司 编辑:程序博客网 时间:2024/06/06 02:16

之前对String和StringBuffer有过一个大概的了解,刚才又在项目中遇到了StringBuilder,所以,趁这个时机学习下这几个类的区别,记录下方便以后查阅~~~哈哈~~~

     String: 字符串常量  StringBuffer: 字符串变量(线程安全)  StringBuilder: 字符串变量(非线程安全)

三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String

String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象如果在Stack中已经存在了某个字符串常量值比如“abc”,如果你需要再生成一个abc的对象,那么JVM只会生成一个指向原来在内存中的“abc”值,而不是重新生成一个新的String对象然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String。

StringBuffer 是对对象本身进行操作,而不是生成新的对象,所以,当字符串对象经常改变而且在多线程操作的情况下,最好使用StringBuffer。然而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:
       String S1 = “This is only a” + “ simple” + “ test”;        StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
       你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM眼里,这个
       String S1 = “This is only a” + “ simple” + “test”; 其实就是
       String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
       String S2 = “This is only a”;String S3 = “ simple”;String S4 = “ test”;String S1 = S2 +S3 + S4;

这时候 JVM 会规规矩矩的按照原来的方式去做, S1 对象的生成速度就不像刚才那么快了,其实是要比StringBuffer慢。而且,这两种情况下String每做一次连接都会产生新的对象。

StringBuffer 线程安全的可变字符序列。类似于 String 的字符串缓冲区,但不能修改。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

       每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大(基于性能考虑,StringBuffer的默认容量为16,当StringBuffer的容量达到最大容量时,她会将自身容量增加到当前的2倍+2,也就是2*n+2。无论何时,只要StringBuffer到达她的最大容量,她就不得不创建一个新的对象数组,然后复制旧的对象数组,这会浪费很多时间。所以给StringBuffer设置一个合理的初始化容量值,是很有必要的!)。

    从 JDK 5.0 开始,为该类增添了一个单个线程使用的等价类,即 StringBuilder 。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作(和StringBuffer相比),但由于它不执行同步,所以速度更快。
对于三者使用的总结: 1.如果要操作少量的数据用 = String 2.单线程操作字符串缓冲区下操作大量数据 = StringBuilder 3.多线程操作字符串缓冲区下操作大量数据 = StringBuffer 
 相同情况下,使用StringBuilder比使用StringBuffer仅能获得10%~15%的性能提升,但却要冒多线程不安全的风险。综合考虑还是建议使用StringBuffer。 
原创粉丝点击