2007太阳成集团游戏中心

 收藏私塾在线
 

欢迎您来到私塾在线网!   

请登录! 

免费注册 

交流首页 » 学习问题讨论 »StringBuffer与StringBuilder解惑  XML
发表人 内容
nices
[头像]

交流经验:
总积分:1037
级别:普通会员
注册时间: 2011-10-19
文章: 87
离线

StringBuffer与StringBuilder的区别?

 

StringBuffer是线程不安全的??

 

但是Api上都写明了StringBuffer与StringBuilder一样都是线程安全的啊,线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。

 

 

StringBuilfer该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快,将 StringBuilder 的实例用于多个线程是不安全的。

 

 

那他们的区别主要是什么???

 




个性签名:从have到how到why的过程
zhang
[头像]

交流经验:
总积分:261656
级别:VIP5
注册时间: 2011-08-09
文章: 1163
离线

1、首先我们看看他们内部如何实现的

 

1.1、如下是StringBuffer的部分实现

 

java代码:
public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    static final long serialVersionUID = 3388685877147921107L;

    /**
     * Constructs a string buffer with no characters in it and an 
     * initial capacity of 16 characters. 
     */
    public StringBuffer() {
	super(16);
    }

    /**
     * Constructs a string buffer with no characters in it and 
     * the specified initial capacity. 
     *
     * @param      capacity  the initial capacity.
     * @exception  NegativeArraySizeException  if the <code>capacity</code>
     *               argument is less than <code>0</code>.
     */
    public StringBuffer(int capacity) {
	super(capacity);
    }

    /**
     * Constructs a string buffer initialized to the contents of the 
     * specified string. The initial capacity of the string buffer is 
     * <code>16</code> plus the length of the string argument.
     *
     * @param   str   the initial contents of the buffer.
     * @exception NullPointerException if <code>str</code> is <code>null</code>
     */
    public StringBuffer(String str) {
	super(str.length() + 16);
	append(str);
    }

    /**
     * Constructs a string buffer that contains the same characters
     * as the specified <code>CharSequence</code>. The initial capacity of
     * the string buffer is <code>16</code> plus the length of the
     * <code>CharSequence</code> argument.
     * <p>
     * If the length of the specified <code>CharSequence</code> is
     * less than or equal to zero, then an empty buffer of capacity
     * <code>16</code> is returned.
     *
     * @param      seq   the sequence to copy.
     * @exception NullPointerException if <code>seq</code> is <code>null</code>
     * @since 1.5
     */
    public StringBuffer(CharSequence seq) {
        this(seq.length() + 16);
        append(seq);
    }

    public synchronized int length() {
	return count;
    }

    public synchronized int capacity() {
	return value.length;
    }


    public synchronized void ensureCapacity(int minimumCapacity) {
	if (minimumCapacity > value.length) {
	    expandCapacity(minimumCapacity);
	}
    }

    /**
     * @since      1.5
     */
    public synchronized void trimToSize() {
        super.trimToSize();
    }

 

1.2、如下是StringBuilder的部分实现

 

 

java代码:
public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{

    /** use serialVersionUID for interoperability */
    static final long serialVersionUID = 4383685877147921099L;

    /**
     * Constructs a string builder with no characters in it and an 
     * initial capacity of 16 characters. 
     */
    public StringBuilder() {
	super(16);
    }

    /**
     * Constructs a string builder with no characters in it and an 
     * initial capacity specified by the <code>capacity</code> argument. 
     *
     * @param      capacity  the initial capacity.
     * @throws     NegativeArraySizeException  if the <code>capacity</code>
     *               argument is less than <code>0</code>.
     */
    public StringBuilder(int capacity) {
	super(capacity);
    }

    /**
     * Constructs a string builder initialized to the contents of the 
     * specified string. The initial capacity of the string builder is 
     * <code>16</code> plus the length of the string argument.  
     *
     * @param   str   the initial contents of the buffer.
     * @throws    NullPointerException if <code>str</code> is <code>null</code>
     */
    public StringBuilder(String str) {
	super(str.length() + 16);
	append(str);
    }

    /**
     * Constructs a string builder that contains the same characters
     * as the specified <code>CharSequence</code>. The initial capacity of
     * the string builder is <code>16</code> plus the length of the
     * <code>CharSequence</code> argument.
     *
     * @param      seq   the sequence to copy.
     * @throws    NullPointerException if <code>seq</code> is <code>null</code>
     */
    public StringBuilder(CharSequence seq) {
        this(seq.length() + 16);
        append(seq);
    }

    /**
     * @see     java.lang.String#valueOf(java.lang.Object)
     * @see     #append(java.lang.String)
     */
    public StringBuilder append(Object obj) {
	return append(String.valueOf(obj));
    }

    public StringBuilder append(String str) {
	super.append(str);
        return this;
    }


 

 

2、从实现上我们可以看出 都是继承AbstractStringBuilder,但StringBuffer所有方法都加了synchronized,而StringBuilder没有,因此StringBuffer是线程安全的,而StringBuilder不是

 

 

3、因此小张老师建议全部采用StringBuilder,而废弃StringBuffer,所以需要线程安全的地方自己加锁进行同步。

 

 

了解如何保证线程安全>>

nices
[头像]

交流经验:
总积分:1037
级别:普通会员
注册时间: 2011-10-19
文章: 87
离线

我说呢,以前还以为StringBuilder是线程安全的,太蠢了


个性签名:从have到how到why的过程
yideng
[头像]

交流经验:
总积分:106
级别:普通会员
注册时间: 2013-05-01
文章: 9
离线

 

zhang写

3、因此小张老师建议全部采用StringBuilder,而废弃StringBuffer,所以需要线程安全的地方自己加锁进行同步。

 

 

 

stringbuffer是安全的,stringBuilder是异步不安全的,为何要废弃buffer呢?而且我们平时不是还在用stringbuffer的append方法吗  ,请帮忙解释下  谢谢



个性签名:没有过不去的坎儿 笨鸟先飞
大宇哥
[头像]

交流经验:
总积分:10389
级别:VIP3
注册时间: 2013-08-09
文章: 39
离线

学习了,java基础是很重要的东西!
 
交流首页 » 学习问题讨论
前往:   

关于我们 | 联系我们 | 用户协议 | 私塾在线服务协议 | 版权声明 | 隐私保护

版权所有 Copyright(C)2009-2012 私塾在线学习网