StringBuffer基本介绍
- StringBuff代表可变的字符串,可以对字符串内容进行增删
- 很多方法与String相同,但StringBuff是可变长度的
- StringBuff是一个容器
了解StringBuffer
StringBuffer的继承关系:
可以看到StringBuffer继承AbstractStringBuilder类。
- StringBuffer的直接父类是AbstractStringBuilder
- StringBuffer实现了Serializable接口,使它的对象可以串行化
- 在AbstractStringBuilder父类中有属性char[] value,与String不同他不是final修饰的。所以这个属性是指向堆的,不是跟String一样指向常量池的
- StringBuffer是一个final类,不能杯继承
- 因为StringBuffer字符串是存在char[] value堆中的,所以所有的变化(增加/删除),不用跟String一样每次都要变换地址和创建新对象,所以效率上高于String
StringBuffer和String的区别
首先最大的区别是保存字符串的空间不一样:
String:private final char [] valur;//指向常量池
StringBuffer:private char [] valur;//指向堆
那么这两者有什么区别呢?通过前面的String类的学习,了解到String类的字符串每当要改变内容时会直接在常量池中寻找有没有,有就直接改变地址指向新内容。如果没有就创建新内容然后指向它。不管那种方式都是会改变指向地址的
而StringBuffer因为不是final修饰所以,就是一个普通的char数组。而数组是保存在堆中的,属于引用类型,可以随意更改在堆中的内容,且地址不会变。除非数组空间满了需要扩容才会更换地址。
示意图演示:
String字符串更改内容
String s1 = new String("123")
s1 = "567";
StringBuffer更改内容
StringBuffer s1 = new StringBuffer("abc")
s1 = "bbc";
StringBuffer的构造器
- StringBuffer():无参构造器,使初始value数组空间容量为16个字符
- StringBuffer(CharSequence seq):构造一个字符串缓冲区,它包含与指定CharSequence 相同的字符
- StringBuffer(int capacity):传入一个int类型,定义value数组的空间容量
- StringBuffer(String str):直接传入一个String类型,保存到value数组,且在这个基础上再+16的字符空间容量
StringBuffer与String的互相转换
String转StringBuffer
第一种:使用构造器,直接传入
String s1 = "qqq";
StringBuffer s2 = new StringBuffer(s1);
第二种:使用StringBuff的append方法
String s1 = "qqq";
StringBuffer s2 = new StringBuffer();
s2 = s2.append(s1);
StringBuffer转String
第一种:使用StringBuffer的toString方法
StringBuffer s1 = "qqq";
String s2 = new String();
s2 = s1.toString();
第二种:使用构造器直接传入
StringBuffer s1 = "qqq";
String s2 = new String(s1);
StringBuffer的常用方法
- append:在字符串后增加内容
- delete(start,end):删除下标start到下标end前的内容
- replace(start,end,string):将下标start到下标end前的内容替换成string
- indexOf:查找子串第一次出现的下标
- insert(int,string):在下标int前插入string新内容,原内容后移
- length:字符串长度
StringBuffer练习题
1.输出什么?为什么
String str =null;
StringBuffer sb = new StringBuffer();
sb.append(str);
System.out.println(sb.length());
System.out.println(sb);
StringBUffer sb2 = new StringBuffer(str);
System.out.println(sb2);
运行:
1.首先输出长度,此时sb是null,调用append,底层最后会使用一个父类的appendNull的方法,把null变成’n’u’l’l’4个字.符存入value,所以长度是4
2.然后输出sb sb是null
3.将str通过构造器传入sb2,而StringBuffer传入string类型的构造器,需要先获取这个string的长度,但是此时str是null所以会报空指针异常:NullPointerException
2.编程题
要求实现输入的数字小数点开始,往前梅隔3位数,就插入一个逗号“,”
比如:123445.22 变成 123,445.22
思路分析:
1.获取输入的数字,转成StringBuffer类型
2.根据小数点,使用lastIndexOf方法找出小数点的下标
3.根据小数点的小标以3为界使用insert方法插入“,”
public class test1 {
public static void main(String[] args) {
String num = "2234323423423424567.23";
StringBuffer sb = new StringBuffer(num);
for (int i = sb.lastIndexOf(".")-3; i > 0; i-=3) {
sb.insert(i,",");
}
System.out.println(sb);
}
}