一.String,StringBuffer和StringBuilder有何异同?
1.String:
-
不可变的字符序列,一旦修改后,立马创建一个新的对象
-
底层使用char[]数组存储
2.StringBuffer:
-
可变字符序列
-
底层使用char[]数组存储
-
涉及多线程,其中的方法使用synchronized线程安全,效率低
3.StringBuilder:
-
可变字符序列
-
底层使用char[]数组存储
-
涉及多线程,线程不安全,效率高
二.StringBuffer
1.StringBuffer源码分析:
char value [];
底层使用char[]数组存储,未经final修饰,所以其值可改变,且默认数组的长度为16
2.使用StringBuffer创建对象的两种方式
①StringBuffer stringbuffer = new StringBuffer();
②StringBuffer stringbuffer1 = new StringBuffer("abc"); //新创建一个对象,内存空间长度为其所需空间长度+16
3.说明:
当向StringBuffer中添加内容时,是将内容添加到底层数组中,数组未被final修饰;当数组储满时,创建一个新的数组,将新数组的地址传输给底层数组,StringBuffer对象是不会改变的.因此,使用StringBuffer不需频繁创建对象
三.StringBuffer常用功能介绍
1.添加功能:
StringBuffer stringBuffer = new StringBuffer("abc");
stringBuffer.append("df"); //向指定位置插入内容,插入位置以后的内容都后移
System.out.println(stringBuffer); //结果为abcdf
stringBuffer.insert(2,"1223"); //向指定位置插入内容
System.out.println(stringBuffer); //结果为ab1223cdf
stringBuffer.deleteCharAt(1); //删除指定位置上的内容
System.out.println(stringBuffer); //结果为a1223cdf
stringBuffer.delete(0,3); //删除指定区间上的内容,包含开头,不包含末尾
System.out.println(stringBuffer); //结果为23cdf
stringBuffer.replace(1,3,"po"); //用指定内容替换指定位置上的内容
System.out.println(stringBuffer); //结果为2podf
2.反转功能:
stringBuffer.reverse(); //逆序字符串
System.out.println(stringBuffer); //结果为fdop2
3.截取功能:
String s = stringBuffer.substring(2); //截取一个字符串副本,并返回一个新的字符串
System.out.println(s); //结果为op2
String s1 = stringBuffer.substring(1,3); //截取区间,并返回一个新的字符串
System.out.println(s1); //结果为do
4.获取长度:
System.out.println(s1.length()); //此时返回的是底层数组中实际转入的字符个数,而不是内存空间大小
四.StringBuilder
-
多线程不安全,其余与StringBuffer相同
-
多线程访问统一资源,不能用StringBuilder