StringBuffer类:
package Changyong;
/*buffer有缓冲的意思
-字符串不可变,但是字符串缓冲区支持字符串改变
*StringBuffer:缓冲区字符串,可以改变
—char[] value 默认大小为:16,装满之后可以扩容
-只需要改变数组地址即可,不需要创建新的StringBuffer对象
*/
public class StringBufferDemo {
public static void main(String[] args) {
/*
String s="a";//a 10 final char[] value
—这里的数组是被final修饰的,是属于不可改变的
s+="a";//aa 11
*/
//StringBuffer的三种构造方法
StringBuffer s=new StringBuffer();//默认容量为16
StringBuffer s_1=new StringBuffer("abc");//容量为字符串长度+16
StringBuffer s_2=new StringBuffer(32);//容量为指定容量
//给StringBuffer添加东西:append
s.append("abc");
s.append("efg");
System.out.println(s);
/*
* 上述操作创建了几个对象?
* -一个,即使值发生了改变,他始终都只有一个对象,源码返回时返回的this
*/
//继续添加内容,直到多出容量
s.append("hijk");
s.append("lmn");
//长度变为34,因为源码定义扩充方式为:长度*2+2 34
/*
//再次添加到超过34
s.append("qazwsxedcrfvtgbyhnujmikolpplomkinjubhyvgtcfredx");
//得出数组长度扩充到60
*/
s.append("qazwsxedcrfvtgbyhnujmikolpplomkinjubhyvgtc");
//得出数组扩充到55
}
}
StringBuffer类的功能:
package Changyong;
public class StringBufferDemo2 {
public static void main(String[] args) {
StringBuffer s=new StringBuffer();//默认容量为16
//添加功能
s.append("abc");
s.append("efg");//向末尾添加
s.insert(2,"XXX");//在指定位置上插入字符串
//abXXXcefg
System.out.println(s);
//删除功能
s.deleteCharAt(2);//删除指定位置上的字符
System.out.println(s);
s.delete(3,5);
System.out.println(s);//删除指定区间的内容,包含开始位置,但不包含结束的位置
//替换功能
s.replace(0,2,"KIJA");//替换指定区间的内容,但是不包含结束的位置
System.out.println(s);
//反转功能
s.reverse();
System.out.println(s);
//截取功能
String str=s.substring(2);//从第二个开始截取到结束,返回一个字符串副本
System.out.println(str);
String str_1=s.substring(0,2);//截取一段指定区间,但是不包含结束位置
System.out.println(str_1);
}
}
StringBuilder类:
package Changyong;
public class StringBuilderDemo {
public static void main(String[] args) {
/*
* 大部分功能与StringBuffer的功能一样
* 也是一样大部分实现都是直接调用的父类的方法
*
* 两个子类实现方式一致,多以都调用的是父类中的方法
* 所以不同的东西,就在子类
*/
StringBuilder s=new StringBuilder();
s.append("rqew");
/* buffer的append中由关键字修饰:
-所有的append都添加了同步关键字的修饰
builder中都没有:
-这个东西牵扯到线程问题:
-如果加了synchronized修饰,一次只能由一个请求进入到方法里进行处理
如果没有添加synchronized进行修饰,在多线程中就可以都进去进行处理
比如遇到了抢票取钱这类问题,如果同时进去可能会导致报错
-也就是说这个玩意儿不适合多用户,只适合单用户
String:
-值不可以改变,一旦值改变就会创建新的String对象
*/
s.insert(2,"asji");
s.reverse();
}
}
StringBuffer和StringBuilder类的异同:
正如上面所讲,StringBuffer和StringBuilder两个类都继承自AbstractStringBuilder,他们大部分的功能都直接继承自父类,所以乍一看这两个子类都很像,但当我们进入源码查看的时候才会发现有不同的地方:
//StringBuffer的append:
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
//StringBuilder的append;
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
上图是StringBuffer和StringBuilder的append方法的源码:
在这里我们发现Buffer的方法前被synchronized关键词修饰,这个是同步关键词修饰,在使用了这个关键词修饰之后,Buffer的方法在进行的时候只能一次只能进行一个请求,无法进行多个请求,在某些时候这个方法会起到很大的保护作用,但目前而言我们无法太深入的理解什么是线程,所以在这里简单的总结就是:Buffer适合单用户,而Builder适合多用户的运行。