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区别之源码解析" 在Java中,字符串是我们经常使用的数据类型,而String、StringBuffer和StringBuilder是Java中三种常用的字符串类。在这篇文章中,我们将从源码角度对String、...
StringBuilder的主要操作是append和insert方法,这些方法可以将任何类型的数据转换为字符串,并将其添加或插入到StringBuilder中。 StringBuffer的特点 StringBuffer是StringBuilder的线程安全版本,它提供了与...
return new StringBuffer().append(s1).append(s2); // 使用 StringBuffer } ``` 这里可以看出,虽然两种方式都可以实现字符串拼接,但是使用 StringBuffer 的方式在多线程环境中更安全。 3. **循环中的字符串...
4. delete 和 deleteCharAt 方法:删除字符串中的子串或者字符,可以指定删除的起始和终止位置。 5. replace 方法:用于替换子串,可以指定要替换的子串和新的子串。 6. reverse 方法:将字符串倒序,可以用于变换...
`append()`方法是`StringBuilder`和`StringBuffer`中字符串拼接的核心。 三、线程安全与效率 `StringBuilder`和`StringBuffer`的主要区别在于线程安全性。`StringBuilder`没有采取任何同步措施,因此在多线程环境下...
在这两个例子中,第一个使用了`+`运算符进行字符串拼接,第二个使用了`StringBuffer`的`append()`方法。后者在循环或大量字符串拼接时效率更高。 #### 示例2 ```java public String getString(String s1, String s2...
`StringBuffer`提供了多种方法来添加内容,如`append()`方法: ```java StringBuffer sb = new StringBuffer(); sb.append("Hello, "); sb.append("World!"); System.out.println(sb); // 输出 "Hello, World!" ```...
向 StringBuffer 中赋值可以通过它的 append 方法,例如 sb.append("hello");。 在字符串连接操作中,StringBuffer 的效率要比 String 高。例如,String str = new String("welcome to ");str += "here";的处理步骤...
append方法用于在末尾添加内容,deleteCharAt和delete方法可以删除特定位置或范围的字符,insert方法在指定位置插入内容,reverse方法反转字符串,而setCharAt方法则允许替换指定位置的字符。最后,trimToSize方法则...
它的内部机制与`String`类似,但是提供了`append()`和`insert()`等方法来改变字符串内容,而不会每次都创建新对象。例如: ```java StringBuffer sb = new StringBuffer("Hello"); sb.append(" World"); // 不会...
Java 高级特性 StringBuffer ...append 方法是 StringBuffer 类中的一种常用方法,该方法的作用是追加内容到当前 StringBuffer 对象的末尾,类似于字符串的连接。调用该方法以后,StringBuffer 对象的内容也发生改变。
`StringBuffer`提供了`append()`方法来方便地追加内容,如`sb.append("hello")`。由于不涉及新的对象创建,`StringBuffer`在处理大量字符串拼接时效率远高于`String`。 在上述代码示例中,我们比较了使用`String`和...
AbstractStringBuilder 是 StringBuffer 和 StringBuilder 两者的父类,它定义了基本的字符串操作方法,如 length()、capacity()、ensureCapacity() 等。AbstractStringBuilder 类中有两个重要的成员变量,value 和 ...
在多线程环境下,`StringBuffer`的方法如`append()`和`insert()`都是同步的,保证了线程安全。 接下来,我们详细讲解`StringBuffer`的一些关键方法: 1. **append()**:此方法用于在现有字符串末尾添加新的字符...
针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍...
而StringBuffer示例中,使用append方法实际上是在修改原有对象的内容,并且这种修改会反映在所有指向这个StringBuffer对象的引用上。 为了进一步理解二者的差异,我们可以通过String和StringBuffer的内存使用和操作...
2. **追加内容**:使用 `append()` 方法可以将指定的内容添加到 `StringBuffer` 的末尾。 ```java sb.append("要追加的字符串"); ``` 3. **插入内容**:使用 `insert()` 方法可以在指定位置插入内容。 ```java ...
`StringBuffer`和`StringBuilder`同样有这些方法,只是它们还额外提供了在字符串末尾添加字符(`append()`)、在任意位置插入字符(`insert()`)、删除特定范围的字符(`delete()`)等操作。 在实际编程中,我们...