(1)为什么需要StringBuffer

由于String的内容是不可变的,在频繁操作字符串的应用中,导致String对象泛滥,不断的被创建和销毁,占用大量的内存和CPU时间。
例如,将十万个"A"连成一个大的字符串。代码如下:

为什么需要StringBuffer_指定位置

这将创建100000个对象,其中有99999个对象是临时对象,是计算的中间结果。JVM需要花费大量的内存来存放,也需要花费大量CPU时间来回收对象。

 

因此,通常要使用可变的字符串缓冲区类(StringBuffer) 来完成类似的工作:

为什么需要StringBuffer_指定位置_02

这样,只需要创建一个StringBuffer和一个String对象就行了。

 

(3)常用方式

为什么需要StringBuffer_字符串_03

运行结果:

为什么需要StringBuffer_字符串_04

 

(4)方法

StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("abcdex");
System.out.println(stringBuffer); //abcdex
//返回当前容量
int capacity = stringBuffer.capacity();
System.out.println(capacity); // 16
//返回长度(字符数)
int length = stringBuffer.length();
System.out.println(length);

//不会影响之后的stringBuffer本身
//截取开始到结尾的字符串,包括开头,不包括结尾
String substring = stringBuffer.substring(0, 3);
System.out.println(substring); //abc
//从指定位置截取到末尾
String substring2 = stringBuffer.substring(3);
System.out.println(substring2); //dex

//会影响之后的stringBuffer本身
//删除指定位置的字符,并返回本身
StringBuffer deleteCharAt = stringBuffer.deleteCharAt(0);
System.out.println(deleteCharAt); // bcdex
//删除从指定位置开始到结束的内容,并返回本身
StringBuffer delete = stringBuffer.delete(0, 3);
System.out.println(delete); // ex
//从开始到结尾用指定字符串替换
StringBuffer replace = stringBuffer.replace(0, 3, "A**");
System.out.println(replace); //A**
//字符串反转
StringBuffer reverse = stringBuffer.reverse();
System.out.println(reverse); //**A
//替换指定位置的字符
stringBuffer.setCharAt(0, 'T');
System.out.println(stringBuffer); //T*A
//在指定的位置(字符个数后)添加新的文本对象
StringBuffer insert = stringBuffer.insert(2, "xx");
System.out.println(insert); //T*xxA

 

为什么需要StringBuffer_指定位置_05