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。
- StringBuffer和StringBuilder和String的区别
- String和StringBuffer和StringBuilder的区别
- StringBuffer和StringBuilder和String的区别
- string和stringBuilder和stringBuffer的区别
- String和StringBuffer和StringBuilder的区别
- String Stringbuffer和StringBuilder的区别
- String Stringbuffer和StringBuilder的区别
- String StringBuffer和StringBuilder的区别?
- String、StringBuffer和StringBuilder的区别
- String 和StringBuffer,StringBuilder的区别
- String,StringBuffer 和StringBuilder的区别
- String、StringBuffer和StringBuilder的区别
- String Stringbuffer和StringBuilder的区别
- String、StringBuffer和StringBuilder的区别
- String 和StringBuffer,StringBuilder的区别
- String、StringBuilder和StringBuffer的区别
- String、StringBuilder和StringBuffer的区别
- String、StringBuilder和StringBuffer的区别
- iros13 paper
- C++ new 详解
- GDAL工具使用示例(一)
- 大数相乘
- Android Bundle类
- String,StringBuffer和StringBuilder的区别
- Axure RP案例教程-系统登陆
- 使用 C++ .NET 和 MFC 嵌入并自动化 Word 文档
- OpenStack filter应用(G版)
- 如何实现文件增量同步——算法
- MFlood源码学习
- Perl 6 解释器的正式版什么时候发布?
- 常见面试题——计算一个字节里有多少bit置1
- vbox bandwidth limitation setup