StringBuffer与StringBuilder的区别
来源:互联网 发布:淘宝怎么买黑客肉鸡 编辑:程序博客网 时间:2024/06/06 02:10
查看Java(1.6)源码发现StringBuffer与StringBuilder的定义如下:
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence{...}
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence{...}
可见,StringBuffer与StringBuilder拥有共同的父类AbstractStringBuilder,并实现了相同的接口java.io.Serializable, CharSequence
接着阅读代码,发现StringBuffer与StringBuilder的大部分方法都类似,不同的地方是,StringBuffer的大部分方法都用Synchronized修饰,而StringBuilder没有。例如
public synchronized StringBuffer append(Object obj) {super.append(String.valueOf(obj)); return this; } public synchronized StringBuffer append(String str) {super.append(str); return this; } public synchronized StringBuffer append(StringBuffer sb) { super.append(sb); return this; }
public StringBuilder append(Object obj) {return append(String.valueOf(obj)); } public StringBuilder append(String str) {super.append(str); return this; } private StringBuilder append(StringBuilder sb) {if (sb == null) return append("null");int len = sb.length();int newcount = count + len;if (newcount > value.length)expandCapacity(newcount);sb.getChars(0, len, value, count);count = newcount; return this; } public StringBuilder append(StringBuffer sb) { super.append(sb); return this; }
可见,StringBuffer是保证操作同步的,可以安全地用于多线程,可以在必要时对这些方法同步,因此特定实例上的操作就好像串行发生一样; StringBuilder不是线程安全的,可以理解为StringBuffer的一个简易替代,用于字符串缓冲区只被单个线程使用的情况(很普遍)。因此如何只在单个线程中操纵字符串,优先使用StringBuilder,由于不用同步控制,所以速度比StringBuffer要快。
继续阅读代码,StringBuffer和StringBuilder的共同父类AbstractStringBuilder的部分代码如下,
abstract class AbstractStringBuilder implements Appendable, CharSequence { /** * The value is used for character storage. */ char value[]; /** * The count is the number of characters used. */ int count; ...}
public int length() {return count; } public int capacity() {return value.length; } public void ensureCapacity(int minimumCapacity) {if (minimumCapacity > value.length) {expandCapacity(minimumCapacity);} } void expandCapacity(int minimumCapacity) {int newCapacity = (value.length + 1) * 2;if (newCapacity < 0) {newCapacity = Integer.MAX_VALUE;} else if (minimumCapacity > newCapacity) {newCapacity = minimumCapacity;} value = Arrays.copyOf(value, newCapacity); }可见,StringBuffer与StringBuilder的底层实现都是基于数组,并且支持动态扩展容量的。
附:String与StirngBuilder的区别
String的定位是字符串常量的表示,在涉及到字符串拼接时,由于String对象不可变,因此是生成新的字符串对象。而StringBuilder则不用生成新的对象。
从JDK1.5开始,带有字符串的连接操作(+),JVM内部采用的是StringBuilder来实现的(即源码编译后的实现)。
参看:http://www.jb51.net/article/86551.htm
- StringBuffer 与 StringBuilder的区别?
- StringBuilder与StringBuffer的区别
- StringBuffer 与 StringBuilder的区别
- StringBuffer与StringBUilder的区别
- StringBuffer与StringBuilder的区别
- StringBuilder与StringBuffer的区别
- StringBuilder与StringBuffer的区别
- StringBuilder与StringBuffer的区别
- StringBuilder与StringBuffer的区别
- StringBuilder与StringBuffer的区别
- StringBuilder与StringBuffer的区别
- StringBuffer与StringBuilder的区别
- StringBuilder与StringBuffer的区别
- StringBuilder与StringBuffer的区别
- StringBuilder与StringBuffer的区别
- StringBuilder与StringBuffer的区别
- StringBuilder与StringBuffer的区别
- StringBuilder与StringBuffer的区别
- Hadoop教程(三):HDFS、MapReduce、程序入门实践
- 【完全版】线段树
- java中一个线程等待另一个线程执行完后再执行
- App多入口实现与取消
- jQuery Ajax使用实例
- StringBuffer与StringBuilder的区别
- MySQL的图形化界面navicat破解版
- 用 Python实现链表的翻转,奇偶下标修改(利用数组,非常简单)
- 秒杀系统的架构解决之道
- POJ 2406 Power Strings(KMP算法)
- google protobuf 发送与接收
- Java学习之LinkList
- 二维码展示界面高亮设置,仿支付宝收款码,付款码界面高亮实现
- 多线程