【Java常识】7.0 StringBuffer的使用
1.0 String和StringBuffer的区别
String在申明后是一个不可变的字符串序列,StringBuffer是可以变的字符序列(通过某些方法)。
StringBuffer是一个类似于String的字符串缓冲区,但是不能像String那样用“+”号去修改,但是可以通过某些方法实现。
2.0 API文档对StringBuffer的描述为:线程安全的可变字符序列。
实际原理不做解释,理解万岁,打比方只有3句话。
2.1 打比方说,上厕所,厕所有门,门上有锁,锁门落锁,我们自然认为上厕所是安全的。
2.2 如果这个厕所是无门无锁,那我们认为这个厕所是不安全的。
2.3 当然,安全的话效率会比较低。
3.0 StringBuffer默认16个字符。
package edp.com.learn1;
public class Demo_StringBuffer {
public static void main(String[] args) {
StringBuffer sBuffer = new StringBuffer();
System.out.println(sBuffer.length()); //容器中的字符个数,实际值。
System.out.println(sBuffer.capacity());//容器的初始容量,理论值。
StringBuffer sBuffer2 = new StringBuffer(10);
System.out.println(sBuffer2.length());
System.out.println(sBuffer2.capacity());
StringBuffer sBuffer3 = new StringBuffer("test");
System.out.println(sBuffer3.length());
System.out.println(sBuffer3.capacity()); //字符串的length+初始容量。
}
}
执行结果如下:
image.png
4.0 append方法和insert方法
public Stringbuffer append(String str)
往StringBuffer中添加字符。可以吧任意数据类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身。
public Stringbuffer insert(int offset ,String str)
在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身。
4.1 StringBuffer是字符串缓冲区。当new的时候是在堆内存创建一个对象,底层是一个长度为16的字符数组。当调用添加的方法时,不会再重新创建对象,不断向原缓冲区添加字符。
代码示范如下:
package edp.com.learn1;
public class Demo_StringBuffer {
public static void main(String[] args) {
StringBuffer sBuffer = new StringBuffer();
System.out.println("刚开始啥也没有,不信你看:");
System.out.println(sBuffer);
StringBuffer sBuffer2 = sBuffer.append(true);
System.out.println(sBuffer2);
StringBuffer sBuffer3 = sBuffer.append("test");
System.out.println(sBuffer3);
StringBuffer sBuffer4 = sBuffer.append(100);
System.out.println(sBuffer4);
System.out.println("整体输出:");
System.out.println(sBuffer); //此处sBuffer相当于sBuffer.toString
System.out.println(sBuffer2);
System.out.println(sBuffer3);
System.out.println(sBuffer4);
}
}
执行结果如下:
image.png
4.2 insert方法报错bug。
package edp.com.learn1;
public class Demo_StringBuffer {
public static void main(String[] args) {
StringBuffer sBuffer = new StringBuffer();
sBuffer.insert(3, "test");
}
}
执行结果如下:
image.png
可以发现在指定位置添加元素,如果没有指定位置的索引,就会报错:索引越界异常。
在默认的StringBuffer 中,没有第一个和第二个位置,自然就没办法在第三个位置插入“test”所以报错。
如下代码运行时则没有问题:
package edp.com.learn1;
public class Demo_StringBuffer {
public static void main(String[] args) {
StringBuffer sBuffer = new StringBuffer("1234");
sBuffer.insert(3, "test");
System.out.println(sBuffer);
}
}
运行结果如下:
image.png
5.0 StringBuffer的删除功能
public StringBuffer deleteCharAt(int index):
删除指定位置的字符并返回本身。
public StringBuffer delete(int start,int end):
删除从指定位置开始指定位置结束的内容,并返回本身。
代码示范:
package edp.com.learn1;
public class Demo_StringBuffer {
public static void main(String[] args) {
StringBuffer sBuffer = new StringBuffer();
sBuffer.append("learnTest");//当缓冲区中这个索引上没有元素的时候会报索引越界异常。
System.out.println(sBuffer);//根据索引删除掉索引位置上对应的字符。
sBuffer.deleteCharAt(5);
System.out.println(sBuffer);
StringBuffer sBuffer2 = new StringBuffer();
sBuffer2.append("learnTest");
sBuffer2.delete(2,4);
System.out.println(sBuffer2);
sBuffer2.delete(0, sBuffer2.length());//清空缓冲区
System.out.println("内容为:"+sBuffer2);
}
}
运行结果:
image.png
6.0 StringBuffer的替换和反转功能
public StringBuffer replace(int start,int end,String str):
从start开始到end用str替换
public StringBuffer reverse():
字符串反转。
代码示范:
package edp.com.learn1;
public class Demo_StringBuffer {
public static void main(String[] args) {
StringBuffer sBuffer = new StringBuffer("heisede");//黑色的
sBuffer.replace(0, 3, "bai");
System.out.println(sBuffer);
sBuffer.reverse();
System.out.println(sBuffer);
StringBuffer sBuffer2 = new StringBuffer("落霞与孤鹜齐飞,秋水共长天一色。");
sBuffer2.reverse();
System.out.println(sBuffer2);
}
}
执行结果:
image.png
7.0 StringBuffer的截取功能
public String subString)(int start):
从指定位置截取到末尾。
public String subString(int start,int end):
截取从指定位置开始到结束位置,包括开始位置,不包括结束位置。
示范代码:
package edp.com.learn1;
public class Demo_StringBuffer {
public static void main(String[] args) {
StringBuffer sBuffer = new StringBuffer("woaizhongguo");//我爱中国
String string = sBuffer.substring(4);
System.out.println(string);
System.out.println(sBuffer);
String string2 = sBuffer.substring(2,4);
System.out.println(string2);
}
}
执行结果:
image.png
8.0 StringBuffer和String的相互转换
String——StringBuffer:
1.通过构造方法
2.通过append()方法
StringBuffer——String:
1.通过构造方法
2.通过toString()方法
3.通过subString(0,length)方法
示范代码如下:
package edp.com.learn1;
public class Demo_StringBuffer {
public static void main(String[] args) {
String string0 = new String("woaiIT");//我爱IT
//String转StringBuffer
StringBuffer sBuffer = new StringBuffer(string0);//我爱IT,通过构造方法
System.out.println(sBuffer);
StringBuffer sBuffer2 = new StringBuffer();
sBuffer2.append(string0);//通过append方法
System.out.println(sBuffer2);
//StringBuffer转String
StringBuffer sBuffer3 = new StringBuffer("woaizhongguo");//我爱中国
String string = new String(sBuffer3);//通过构造方法
String string2 = sBuffer3.toString();//通过toString方法
String string3 = sBuffer3.substring(2,4);//通过截取字符串转换
System.out.println(string);
System.out.println(string2);
System.out.println(string3);
}
}
执行结果:
image.png
9.0 StringBuffer实现数组转换为String
或者说,怎么把数组转化为字符串,就可以通过StringBuffer实现。通过String实现,会不断的产生垃圾,而用StringBuffer对象只有一个。
示范代码如下:
package edp.com.learn1;
public class Demo_StringBuffer {
public static void main(String[] args) {
int[] arr= {1,2,3};
System.out.println(arrayToString(arr));
}
private static String arrayToString(int[] array) {
StringBuffer sBuffer = new StringBuffer();
sBuffer.append("[");
for (int i = 0; i < array.length; i++) { //遍历数组
if (i ==array.length-1) {
//这里不要用sBuffer.append(array[i]+",");
//在连接符号的底层,代码调用还会创造一个新的对象StringBuffer
//添加进去后还会通过tuString转换出来
sBuffer.append(array[i]).append("]");
}else {
sBuffer.append(array[i]).append(",");
}
}
return sBuffer.toString();
}
}
执行结果如下:
image.png
10.0 StringBuffer实现字符串反转
看代码:
package edp.com.learn1;
import java.util.Scanner;
public class Demo_StringBuffer {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String lineString = scanner.nextLine();
System.out.println(revString(lineString));
}
public static String revString(String lineString) {
StringBuffer sBuffer = new StringBuffer(lineString);
sBuffer.reverse();
return sBuffer.toString();
}
}
执行结果:
image.png
image.png
10.0 StringBuffer和StringBuilder的区别
两者的方法都是一样的。
StringBuffer是jdk1.0版本的,线程安全,效率低。
StringBuilder是jdk1.5版本的,线程不安全,效率高。
和String的区别:
String是不可变的字符序列。
StringBuffer和StringBuilder是可变的字符序列。
所以,如果仅仅是使用的话,两者没有什么区别。
11.0 StringBuffer和StringBuilder作为参数传递
回顾一下,基本数据类型的值传递,不改变其值。
引用数据类型的值传递,改变其值。
但是这里有点问题,String类虽然是引用数据类型,但是当做参数传递时和基本数据类型是一样的。
如下例:
package edp.com.learn1;
public class Demo_StringBuffer {
public static void main(String[] args) {
String string = "woaiIT";
System.out.println(string);
change(string);
System.out.println(string);
}
public static void change(String string) {
string +="woshuixingganggang";
}
}
执行结果为:
image.png
可见,并没有被传递之后的操作改变。
对比代码如下:
package edp.com.learn1;
public class Demo_StringBuffer {
public static void main(String[] args) {
String string = "woaiIT";
System.out.println(string);
change(string);
System.out.println(string);
StringBuffer sBuffer = new StringBuffer();
sBuffer.append("woaiIT");
System.out.println(sBuffer);
change(sBuffer);
System.out.println(sBuffer);
}
public static void change(StringBuffer sBuffer) {
sBuffer.append("woshuixingganggang");
}
public static void change(String string) {
string += "woshuixingganggang";
}
}
执行结果如下:
image.png
END