大家都知道处理字符串连接时StringBuffer比String效率高,因为从编译的字节码中也可以看到String的相加也是要转换为StringBuffer来进行的。
比如对于这几句代码 ①String s = "Hello"; ②s=s+" Java"; ③s=s+" World!"; 反编译之后从字节码可以看出虚拟机实际是如何处理的(具体字节码这里就略去了,对于详细字节码的分析我想如果需要的时候以后会单独写一篇来介绍):
执行第①条语句不消说
执行第②条语句时虚拟机会以 s 为参数 new 一个StringBuffer,然后往这个StringBuffer append " Java"到最后,然后 toString() 回字符串赋给s
执行第③条语句时虚拟机又以当前的 s 为参数 new 一个StringBuffer,然后往这个StringBuffer append " World!" 到最后,再 toString() 回成字符串赋给s
从以上过程我们就能够预见到,如果更多的字符串连接,中间过程要产生多少个StringBuffer实例啊,这是一个很大的开销,如果换成代码中直接用StringBuffer来处理字符串连接效率就高多了,区别是数量级的,不信你亲自去测试一个两种方式所用的时间值比较,我测过。
好啦,联系不是很大的话扯了一大堆了,这里主要是讲 StringBuffer 和 StringBuilder 的区别啊。那是在当我对字符串连接代码转换成字节码时发现,JDK1.5下的字节码不再是StringBuffer,而全是用了JDK1.5才开始有的StringBuilder,如下:
16: invokevirtual #34; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
那么StringBuilder是一个什么东西呢,它和StringBuffer之间有什么区别呢?这个疑问留在我的脑海里一年有余了,主要总想那不是一个很容易理解的东西,我直到现在才开始真正要去琢磨它。说起来这可不是我通常对待新鲜玩艺儿的风格。
现在看了,知道了,太简单了,其实说白了,StringBuffer 和 StringBuilder 的区别就如同 HashTable 和 HashMap 的区别;就如同 ArrayList 和 Vector 的区别。是的,只是区别在同步与非同步上、线程安全与不安全,同时由此影响的单线程环境时的性能上。
StringBuffer 和 StringBuilder 在提供给外部方法是一样的,只是 StringBuffer 的方法前都加有 synchronized 关键字,而 StringBuilder的方法前没有 synchronized 。因此 StringBuilder 比 StringBuffer 处理起来要快。相信刚开始学Java时就有人告诉过你(或者是在面试时被问到过):推荐使用 ArrayList 来代替 Vector ,同样如果你用 JDK1.5 话也推荐你多用 StringBuilder 而不是 StringBuffer ,因为单线程或多线程但安全的情况比较普遍,就因为 StringBuilder的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer。
本文来自 :http://www.blogjava.net/Unmi/archive/2006/01/12/124021.html
分享到:
相关推荐
String StringBuffer和StringBuilder 区别之源码解析 从源码角度简单对它们之间的区别进行了验证
String,StringBuffer,StringBuilder区别。几乎所有的应用开发都离不开操作字符串,理解字符串的设计和实现以及相关 工具如拼接类的使用,对写出高质量代码是非常有帮助的
String、StringBuilder和StringBuffer的区别 String、StringBuilder和StringBuffer的区别 String、StringBuilder和StringBuffer的区别
StringBuffer:字符创变量 StringBuilder:字符创变量 从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:
下面小编就为大家带来一篇浅谈java中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、StringBuffer和StringBuilder的区别
stringbuilder用法 String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String...
目录StringStringBuffer与StringBuilder总结 String ...StringBuffer与StringBuilder 这两者基本相似,都是可变字符串对象,主要区别为线程是否安全。 总结 最后,引用菜鸟教程下的总结以及相关评论: S
主要介绍了java 中String和StringBuffer与StringBuilder的区别及使用方法的相关资料,在开发过程中经常会用到String 这个类进行操作,需要的朋友可以参考下
String、StringBuilder以及StringBuffer的区别
string,stringbuffer,stringbuilder
string,stringBuffer,stringBuilder
java中String、StringBuffer、StringBuilder是编程中经常使用的字符串类,他们之间有什么区别呢?下面小编给大家总结了Java中String、StringBuffer、StringBuilder的区别详解,需要的朋友参考下吧
关于String、StringBuilder、StringBuffer的本质区别,
主要介绍了Java 中 String,StringBuffer 和 StringBuilder 的区别及用法的相关资料,需要的朋友可以参考下
Java中String,StringBuffer与StringBuilder的区别和用法。