stringbuffer append方法(java中,定义一个StringBuffer空构造,为什么能通过append添加超过16个字符)

本文目录
- java中,定义一个StringBuffer空构造,为什么能通过append添加超过16个字符
- stringbuilder与stringbuffer 谁的append方法有关键字
- java语言:String类的concat方法与StringBuffer类的append方法区别内存状态
- StringBuffer类 的append方法 怎么添加字符串
- StringBuffer的“append“ 和 String的“+“用来连接字符串哪个好些
- StringBuilder的append方法和String+String的区别
- stringbuffer的append方法返回类型是什么
java中,定义一个StringBuffer空构造,为什么能通过append添加超过16个字符
这个原理和List、Map、Set等集合类型是一样的,都会有初始容量,因为底层都是利用了array数组进行存储。但无论哪种类型,其增加元素但方法中都会去校验数组长度,并自动扩容。
具体到StringBuffer中,在其append方法里面实际上会在真正加入数组前调用方法:
ensureCapacityInternal(int minimumCapacity)来确保数组有足够的空间存储,如果没有会自动扩容。
stringbuilder与stringbuffer 谁的append方法有关键字
java中String、StringBuffer、StringBuilder的区别
java中String、StringBuffer、StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题。现在总结一下,看看他们的不同与相同。
1.可变与不可变
String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。
private final char value;
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。
char value;
2.是否多线程安全
String中的对象是不可变的,也就可以理解为常量,显然线程安全。
AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。看如下源码:
1 public synchronized StringBuffer reverse() {
2 super.reverse();
3 return this;
4 }
5
6 public int indexOf(String str) {
7 return indexOf(str, 0); //存在 public synchronized int indexOf(String str, int fromIndex) 方法
8 }
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
3.StringBuilder与StringBuffer共同点
StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。
抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。
StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer会在方法上加synchronized关键字,进行同步。
最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。
java语言:String类的concat方法与StringBuffer类的append方法区别内存状态
首先我们先看几个概念:
1:在java内部是对+进行了重载,在处理String的过程中要创建一个StringBuffer对象,用StringBuffer对象的append方法对字符串进行连接,最后调用toString方法返回String字符串。
2: +和concat操作,是先开辟一个要拼接的字符串的空间,在和老字符串一起拼接成一个新的字符串,所以在堆内存中是创建了三块空间的;
然后先来说1和2的区别:line1: 用的是+,+在底层是通过StringBuffer对象的append方法对字符串进行连接,但是他也并不是直接添加的,我们看看他开辟了几块空间?“abc”“def”“ghi”,刚开始开辟了三块堆内存空间,执行一次+,“abcdef”这是第四块内存空间,最后是最终结果“abcdefghi”开辟了第五块堆内存空间,然后其余的被回收。
line2:同样也是开辟了五块堆内存空间,concat()和+号的区别我们可以看下concat()源代码:
public String concat(String str) {int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
/*copyOf数组复制,copyOf()的第二个自变量指定要建立的新数组长度,
如果新数组的长度超过原数组的长度,则保留为默认值null或0*/
char buf = Arrays.copyOf(value, len + otherLen);
//将字符从此字符串复制到目标字符数组,len为数组中的起始偏移量
str.getChars(buf, len);
return new String(buf, true);
}
我们可以看到concat()方法是通过copyOf(),和getChars();两个方法来拼接数组的。+在底层是通过StringBuffer对象的append方法对字符串进行连接。
最后是StringBuffer:StringBuffer使用时,只会开辟一块内存空间,使用append添加或delete删除其内容时,也是在这一块内存空间中并不会生成多余的空间。所以速度是比较快的而String 每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,对速度的影响一定是相当大的。
StringBuffer类 的append方法 怎么添加字符串
StringBuffer类 的append方法添加字符串的方法:
第一种,代码如下
StringBuffer sb=new StringBuffer();
sb.append(“《?xml version=\“1.0\“ encoding=\“UTF-8\“?》“);
第二种,代码如下
sb.append(“《?xml version=’1.0’ encoding=’UTF-8’?》“);
StringBuffer的“append“ 和 String的“+“用来连接字符串哪个好些
String一旦赋值或实例化后就不可更改,如果赋予新值将会重新开辟内存地址进行存储。
而StringBuffer类使用append和insert等方法改变字符串值时只是在原有对象存储的内存地址上进行连续操作,减少了资源的开销。
因此我们得出结论:当需要进行频繁修改字符串的操作时先建立StringBuffer类对象进行操作,将最后结果转化成String类对象返回,这样效率会高很多。
StringBuilder的append方法和String+String的区别
StringBuilder和StringBuffer,字符串是存放在char中的,char是存放在堆中的。
相比String每次+都重新创建一个String对象,重新开辟一段内存不同,StringBuilder和StringBuffer的append都是直接把String对象中的char的字符直接拷贝到StringBuilder和StringBuffer的char上,效率比String的+高得多。当然,当StringBuilder和StringBuffer的char长度不够时,也会重新开辟一段内存。
另外,StringBuffer是线程安全的,StringBuilder不是线程安全的。
stringbuffer的append方法返回类型是什么
append方法的返回类型是StringBuffer,返回的就是调用append方法的当前对象。
下面是一个小例子:
public class Test
{
public static void main (String args)
{
StringBuffer sb=new StringBuffer();
sb.append(“aaa“).append(“bbb“);
System.out.println(sb);
}
}
运行结果如下图:

本文相关文章:
assert函数php(如何通过非数字与字符的方式实现PHP WebShell详解)
2026年9月6日 10:20
java mapreduce(如何通过Java程序提交yarn的MapReduce计算任务)
2026年8月27日 22:50
更多文章:
易语言网页api接口怎么调用(易语言,怎么读取网页json的api)
2026年10月11日 08:00
majority of(the majority of 和 a majority of的区别以及用法例句)
2026年10月11日 07:40
another time(another time和other time的区别)
2026年10月11日 05:00






