`

StringBuffer源码浅析(大致结构和append方法)

阅读更多

StringBuffer类继承自AbstractStringBuilder抽象类,实现Serializable序列化接口和CharSequence接口。

AbstractStringBuilder抽象类实现Appendabel,CharSequence接口。

另外,StringBuilder的源码跟StringBuffer类似,看完Buffer再看Builder,找出不同点看看就大致可以。

 

一,关于append方法浅析。

append方法都做了同步声明,其中源码如下

 

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

 

1、StringBuffer的方法都加了synchronized关键字,线程安全。

2、synchronized代表方法加锁,例如线程A,要运行到声明了synchronized 方法时,先检查有没有其他线程B,C正在使用这synchronized 方法,若有就先等B,C线程运行完这个synchronized 方法后,在运行A,若无直接运行,

3、synchronized两种用法:synchronized方法和synchronized块。

synchronized(syncObject) {  // synchronized代码块
  //允许访问控制的代码
}

4、围观append源码

     第一步:StringBuffer类体内

 

/*

 *  可见是通过super调用父类AbstractStringBuilder中定义的append方法。
 */
public synchronized StringBuffer append(StringBuffer sb) {
        super.append(sb);
        return this;
}

 

 

    第二步:AbstractStringBuilder抽象类体内

 

/**
 *  AbstractStringBuilder属性有:
 *          char value[];  // The value is used for character storage(). 容量
 *          int count;  // The count is the number of characters used.实际字符数
 */
public AbstractStringBuilder append(StringBuffer sb) {
	if (sb == null)
            return append("null");
	int len = sb.length();
	int newCount = count + len;  
	if (newCount > value.length)
	    expandCapacity(newCount); // 若value存储容量不够需扩容。扩容方法省略暂不分析,基本上根据Arrays.copyOf()方法,复制指定的数组,以使副本具有指定的长度。到头来copyOf的源码一样是利用arraycopy方法来复制数组和扩容
	sb.getChars(0, len, value, count); // 把sb的内容0->len复制到value中,注意value参数,此时的value是已经扩容后的value。
	count = newCount;  // 更新新count值
	return this;
}

    原有count要加上len(len也就是新增的count)成newCount,若这newCount总数要大于原有value的容量,就要     扩容才可以容纳newCount个字符。再用getChars复制数组。

 

    第三步:AbstractStringBuilder里定义的getChars方法体,是对System.arraycopy方法 + 边界检查的进一步封装                 而已。

 

public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) //  dstBegin就是原有count接下来的位置
    {
	if (srcBegin < 0)
	    throw new StringIndexOutOfBoundsException(srcBegin);
	if ((srcEnd < 0) || (srcEnd > count))
	    throw new StringIndexOutOfBoundsException(srcEnd);
        if (srcBegin > srcEnd)
            throw new StringIndexOutOfBoundsException("srcBegin > srcEnd"); //以上是Bound Check
	System.arraycopy(value, srcBegin,dst, dstBegin, srcEnd - srcBegin);  // 从指定源数组中复制一个数组
}

    arraycopy方法参数

          src - 源数组。

srcPos - 源数组中的起始位置。
dest - 目标数组。
destPos - 目标数据中的起始位置。
length - 要复制的数组元素的数量。 

    注意value和dst

这个value是sb.value,srcEnd-srcBegin个元素全部复制dst(也就是扩容的value)中。(这里我理解正确吗?)

 

待续...

分享到:
评论

相关推荐

    String StringBuffer和StringBuilder区别之源码解析

    "String StringBuffer和StringBuilder区别之源码解析" 在Java中,字符串是我们经常使用的数据类型,而String、StringBuffer和StringBuilder是Java中三种常用的字符串类。在这篇文章中,我们将从源码角度对String、...

    从源码角度简单看StringBuilder和StringBuffer的异同(全面解析)

    StringBuilder的主要操作是append和insert方法,这些方法可以将任何类型的数据转换为字符串,并将其添加或插入到StringBuilder中。 StringBuffer的特点 StringBuffer是StringBuilder的线程安全版本,它提供了与...

    StringBuffer和String_区别

    return new StringBuffer().append(s1).append(s2); // 使用 StringBuffer } ``` 这里可以看出,虽然两种方式都可以实现字符串拼接,但是使用 StringBuffer 的方式在多线程环境中更安全。 3. **循环中的字符串...

    StringBuffer

    4. delete 和 deleteCharAt 方法:删除字符串中的子串或者字符,可以指定删除的起始和终止位置。 5. replace 方法:用于替换子串,可以指定要替换的子串和新的子串。 6. reverse 方法:将字符串倒序,可以用于变换...

    Java StringBuilder和StringBuffer源码分析

    `append()`方法是`StringBuilder`和`StringBuffer`中字符串拼接的核心。 三、线程安全与效率 `StringBuilder`和`StringBuffer`的主要区别在于线程安全性。`StringBuilder`没有采取任何同步措施,因此在多线程环境下...

    String和StringBuffer详细用法总结

    在这两个例子中,第一个使用了`+`运算符进行字符串拼接,第二个使用了`StringBuffer`的`append()`方法。后者在循环或大量字符串拼接时效率更高。 #### 示例2 ```java public String getString(String s1, String s2...

    Java中StringBuffer对象的初始化.pdf

    `StringBuffer`提供了多种方法来添加内容,如`append()`方法: ```java StringBuffer sb = new StringBuffer(); sb.append("Hello, "); sb.append("World!"); System.out.println(sb); // 输出 "Hello, World!" ```...

    String ,StringBuffer与StringBuilder

    向 StringBuffer 中赋值可以通过它的 append 方法,例如 sb.append("hello");。 在字符串连接操作中,StringBuffer 的效率要比 String 高。例如,String str = new String("welcome to ");str += "here";的处理步骤...

    Java中StringBuffer的常用方法.pdf

    append方法用于在末尾添加内容,deleteCharAt和delete方法可以删除特定位置或范围的字符,insert方法在指定位置插入内容,reverse方法反转字符串,而setCharAt方法则允许替换指定位置的字符。最后,trimToSize方法则...

    String、StringBuffer、StringBuilder的使用方法

    它的内部机制与`String`类似,但是提供了`append()`和`insert()`等方法来改变字符串内容,而不会每次都创建新对象。例如: ```java StringBuffer sb = new StringBuffer("Hello"); sb.append(" World"); // 不会...

    java高级特性StringBuffer类.doc

    Java 高级特性 StringBuffer ...append 方法是 StringBuffer 类中的一种常用方法,该方法的作用是追加内容到当前 StringBuffer 对象的末尾,类似于字符串的连接。调用该方法以后,StringBuffer 对象的内容也发生改变。

    String和StringBuffer的区别

    `StringBuffer`提供了`append()`方法来方便地追加内容,如`sb.append("hello")`。由于不涉及新的对象创建,`StringBuffer`在处理大量字符串拼接时效率远高于`String`。 在上述代码示例中,我们比较了使用`String`和...

    StringBuffer & StringBuilder 源码分析.docx

    AbstractStringBuilder 是 StringBuffer 和 StringBuilder 两者的父类,它定义了基本的字符串操作方法,如 length()、capacity()、ensureCapacity() 等。AbstractStringBuilder 类中有两个重要的成员变量,value 和 ...

    Java语言中StringBuffer的用法

    在多线程环境下,`StringBuffer`的方法如`append()`和`insert()`都是同步的,保证了线程安全。 接下来,我们详细讲解`StringBuffer`的一些关键方法: 1. **append()**:此方法用于在现有字符串末尾添加新的字符...

    源码string和stringbuffer

    针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍...

    String与StringBuffer区别详解

    而StringBuffer示例中,使用append方法实际上是在修改原有对象的内容,并且这种修改会反映在所有指向这个StringBuffer对象的引用上。 为了进一步理解二者的差异,我们可以通过String和StringBuffer的内存使用和操作...

    StringBuffer类的总结

    2. **追加内容**:使用 `append()` 方法可以将指定的内容添加到 `StringBuffer` 的末尾。 ```java sb.append("要追加的字符串"); ``` 3. **插入内容**:使用 `insert()` 方法可以在指定位置插入内容。 ```java ...

    string和StringBuffer的区别

    `StringBuffer`和`StringBuilder`同样有这些方法,只是它们还额外提供了在字符串末尾添加字符(`append()`)、在任意位置插入字符(`insert()`)、删除特定范围的字符(`delete()`)等操作。 在实际编程中,我们...

Global site tag (gtag.js) - Google Analytics