StringBuffer概述和使用
- 一、StringBuffer类概述
- 二、StringBuffer类的构造方法
- 三、StringBuffer的添加功能
- 四、StringBuffer的删除功能
- 五、StringBuffer的替换和反转功能
- 六、StringBuffer的截取功能及注意事项
- 七、StringBuffer和String的相互转换
- 八、一道练习:将数组转成字符串,要求使用StringBuffer
- 九、一道练习:将数组转成字符串,键盘录入"abc",输出结果:"cba",要求使用StringBuffer
- 十、String、StringBuffer和StringBuilder的区别
- 十一、String和StringBuffer分别作为参数传递
一、StringBuffer类概述
StringBuffer概述:
stringBuffer是一个字符串的缓冲区,相当于是一个容器
StringBuffer和String的区别 :
String是一个不可变的字符序列
StringBuffer是一个可变的字符序列
二、StringBuffer类的构造方法
StringBuffer的构造方法:
public StringBuffer():无参构造方法
public StringBuffer(int capacity):指定容量的字符串缓冲区对象
public StringBuffer(String str):指定字符串内容的字符串缓冲区对象
StringBuffer的方法:
public int capacity():返回当前容量。 理论值(不掌握)
public int length():返回长度(字符数)。 实际值
public class StringBuffer_01 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
System.out.println(sb.length()); //0 //容器中的字符个数,实际值
System.out.println(sb.capacity()); //16 //容器的初始容量,理论值
StringBuffer sb2 = new StringBuffer(10);
System.out.println(sb2.length()); //0
System.out.println(sb2.capacity()); //10
StringBuffer sb3 = new StringBuffer("chen");
System.out.println(sb3.length()); //5 //实际字符的个数
System.out.println(sb3.capacity()); //20 //字符串的length + 初始容量
}
}
三、StringBuffer的添加功能
第一个方法
StringBuffer的添加功能:
public StringBuffer append(String str):
可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
public class StringBuffer_01 {
/**
StringBuffer的添加功能
public StringBuffer append(String str):
可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
StringBuffer是字符串缓冲区,当new的时候是在堆内存创建了一个对象,底层是一个长度为16的字符数组
当调用添加的方法时,不会再重新创建对象,在不断向原缓冲区添加字符
*/
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
StringBuffer sb2 = sb.append(true);
StringBuffer sb3 = sb.append("chen");
StringBuffer sb4 = sb.append(100);
//StringBuffer类中重写了toString方法,显示的是对象中的属性值
System.out.println(sb.toString()); //truechen100
System.out.println(sb2.toString()); //truechen100
System.out.println(sb3.toString()); //truechen100
System.out.println(sb4.toString()); //truechen100
}
}
运行上面的程序我们发现,结果都是为 truechen100,原因如下:
一、因为StringBuffer 它是一个可变的字符序列,四个引用指向的是同一个对象,操作的都是同一个对象
二、string是不变的序列,赋完值之后,你再想对它进行赋值,原来的那个就变成了垃圾,而我们的这个StringBuffer没有变成垃圾
我们另外说一下为什么是输出语句是:sb.toString()这个方法,其实我们直接写sb,不摇toString其实也是可以的,因为它重写了StringBuffer重写了ToString这个方法。。如果没有重写toString这个方法,那么我们输出的应该是一个地址值。
第二个方法
StringBuffer的添加功能:
public StringBuffer insert(int offset,String str):
在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
public class StringBuffer_01 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("1234");
sb.insert(3, "chen"); //在指定位置添加元素,如果没有指定位置的索引就会报索引越界异常
System.out.println(sb); //123chen4
}
}
四、StringBuffer的删除功能
StringBuffer的删除功能
一、public StringBuffer deleteCharAt(int index):
删除指定位置的字符,并返回本身
二、public StringBuffer delete(int start,int end):
删除从指定位置开始指定位置结束的内容,并返回本身
public static void main(String[] args) {
// 一、
StringBuffer sb = new StringBuffer();
sb.append("chenj");
sb.deleteCharAt(4); //根据索引删除掉索引位置上对应的字符
System.out.println(sb); //chen
// 二、
StringBuffer sb1 = new StringBuffer();
sb1.append("chenjian");
sb1.delete(0,2); //包含头,不包含尾
System.out.println(sb1); //enjian
// ↓ 扩展内容 ↓
//清空缓冲区
sb1.delete(0,sb1.length());
System.out.println(sb1); //什么都没有,空白
sb1 = new StringBuffer(); //不要用这种方式清空缓冲区,原来的会变成垃圾
System.out.println(sb1);
}
五、StringBuffer的替换和反转功能
StringBuffer的替换和反转功能
一、public StringBuffer replace(int start,int end,String str):
从start开始到end用str替换
二、StringBuffer的反转功能
public StringBuffer reverse():
字符串反转
public static void main(String[] args) {
// 一、
StringBuffer sb = new StringBuffer("heigui");
sb.replace(0, 3, "baa"); //替换,含头不含尾
System.out.println(sb); //baagui
// 二、
sb.reverse(); //反转
System.out.println(sb); //iugaab
}
六、StringBuffer的截取功能及注意事项
StringBuffer的截取功能
一、public String substring(int start):
从指定位置截取到末尾
二、public String substring(int start,int end):
截取从指定位置开始到结束位置,包括开始位置,不包括结束位置
注意事项
返回值类型不再是StringBuffer本身,返回值是String
public static void main(String[] args) {
// 一、
StringBuffer sb = new StringBuffer("人在塔在,长枪依在");
String str = sb.substring(4); //含头不含尾
System.out.println(str); //,长枪依在
//sb本身并没有改变
System.out.println(sb); //人在塔在,长枪依在
// 二、
String str3 = sb.substring(4, 7); //包括开始位置,不包括结束位置
System.out.println(str3); //,长枪
}
七、StringBuffer和String的相互转换
一、String →→ StringBuffer
1、通过构造方法
2、通过append()方法
二、 StringBuffer →→ String
1、通过构造方法
2、通过toString()方法
3、通过subString(0,length);
public static void main(String[] args) {
// 一、String --→ StringBuffer 通过构造方法将字符串转换为StringBuffer对象
StringBuffer sb1 = new StringBuffer("chen");
System.out.println(sb1);
// 一、String --→ StringBuffer 通过append方法将字符串转换为StringBuffer对象
StringBuffer sb2 = new StringBuffer();
sb2.append("chen");
System.out.println(sb2);
StringBuffer sb = new StringBuffer("chen");
// 二、StringBuffer --→ String 通过构造将StringBuffer转换为String
String s1 = new String(sb);
System.out.println(s1);
// 二、 StringBuffer --→ String 通过toString方法将StringBuffer转换为String
String s2 = sb.toString();
System.out.println(s2);
// 二、StringBuffer --→ String 通过截取子字符串将StringBuffer转换为String
String s3 = sb.substring(0, sb.length());
System.out.println(s3);
}
八、一道练习:将数组转成字符串,要求使用StringBuffer
练习题:把数组中的数据按照指定个格式拼接成一个字符串
举例:
int[] arr = {1,2,3};
输出结果:
"[1, 2, 3]"
用StringBuffer的功能实现 如下:
public static void main(String[] args) {
int[] arr = {1,2,3};
System.out.println(arrayToString(arr)); //【1, 2, 3, 】
}
public static String arrayToString(int[] arr) {
StringBuffer sb = new StringBuffer(); //创建字符串缓冲区对象
sb.append("["); //将[添加到缓冲区
//{1,2,3}
for (int i = 0; i < arr.length; i++) { //遍历数组
if(i == arr.length - 1) {
sb.append(arr[i]).append("]"); //[1, 2, 3]
}else {
sb.append(arr[i]).append(", "); //[1, 2,
}
}
return sb.toString();
}
九、一道练习:将数组转成字符串,键盘录入"abc",输出结果:“cba”,要求使用StringBuffer
练习题:把字符串反转
举例:键盘录入"abc"
输出结果:"cba"
用StringBuffer的功能实现 ,如下:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //创建键盘录入对象
String line = sc.nextLine(); //将键盘录入的字符串存储在line中
System.out.println(revString(line));
}
/*
* 将字符串反转
* 1,返回值类型String
* 2,参数列表String line
*/
public static String revString(String line) {
StringBuffer sb = new StringBuffer(line); //将字符串转换为StringBuffer对象
sb.reverse(); //将缓冲区的内容反转
return sb.toString();
}
十、String、StringBuffer和StringBuilder的区别
一、StringBuffer和StringBuilder的区别:
* StringBuffer是jdk1.0版本的,是线程安全的,效率低 (比如一个厕所,有门)是同步的。
* StringBuilder是jdk1.5版本的,是线程不安全的,效率高 (比如一个厕所,没有门)是不同步的。
二、String和StringBuffer,StringBuilder的区别:
* String是一个不可变的字符序列
* StringBuffer,StringBuilder是可变的字符序列
十一、String和StringBuffer分别作为参数传递
形式参数问题:
String作为参数传递
StringBuffer作为参数传递
案例演示:
String和StringBuffer分别作为参数传递问题
基本数据类型的值传递,不改变其值
引用数据类型的值传递,改变其值
String类虽然是引用数据类型,但是他当作参数传递时和基本数据类型是一样的
例子如下:
public static void main(String[] args) {
// ↓ String作为参数传递 ↓
String s = "heima";
System.out.println(s); //heima
change(s);
System.out.println(s); //heima
System.out.println("---------------------");
// ↓ StringBuffer作为参数传递 ↓
StringBuffer sb = new StringBuffer();
sb.append("heima");
System.out.println(sb); //heima
change(sb);
System.out.println(sb); //heimaitcast
}
//StringBuffer作为参数传递
public static void change(StringBuffer sb) {
sb.append("itcast");
}
//String作为参数传递
public static void change(String s) {
s += "itcast";
}