基本介绍
java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删;
很多方法与String相同,但是StringBuffer是可变长度的;
StringBuffer是一个容器。
1)StringBuffer是一个final类,无法被继承;
2)实现了Serializable接口,即StringBuffer的对象可以串行化,可以保存到文件或者网络传输;
3)继承了抽象类AbstractStringBuilder
4)AbstractStringBuilder属性 char[] value,存放的字符序列。
package com.pero.stringbuffer_;
/**
* @author Pero
* @version 1.0
*/
public class StringBuffer01 {
//1.StringBuffer 的直接父类是 AbstractStringBuilder
//2.StringBuffer 实现了Serializable 接口,即StringBuffer的对象可以串行化,可以保存到文件或者网络传输;
//3.在父类中 AbstractStringBuilder 有属性 char[] value,不是final的,
// 该value数组存放字符串内容是存放在堆中,不是存放在常量池中
//4.StringBuffer是一个final类不可以被继承
StringBuffer stringBuffer = new StringBuffer("hello");
}
String和StringBuffer对比
1)String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率较低(private final char[] value,指向常量池);
2)StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上可以更新内容,不用每次更新地址(当空间不足是更新地址,数组存储空间为16个字符),效率较高(char[] value,放在堆中)。
StringBuffer的构造器
1)StringBuffer()
构造一个其中不带字符串缓冲区,其初始容量为16个字符;
2)StringBuffer(CharSequence seq)
public java.lang.StringBuilder(CharSequence seq)构造一个字符串缓冲区,它包含与指定的CharSequence相同的字符
3)StringBuffer(int capacity)//capacity[容量]
构造一个不带字符的,但是具有指定初始容量的字符缓冲区。即对char[]的容量大小进行指定
4)StringBuffer(String str)
构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。
package com.pero.stringbuffer_;
/**
* @author Pero
* @version 1.0
*/
public class StringBuffer02 {
public static void main(String[] args) {
//StringBuffer的构造器的使用
//1.创建一个容量大小为16的char[],用于存放字符内容
StringBuffer stringBuffer = new StringBuffer();
//2.通过构造器指定char[]数组的容量大小
StringBuffer stringBuffer1 = new StringBuffer(100);
//3.通过给一个String创建StringBuffer,把当前字符串长度加16个字符,
// 生成一个新的字符数组传给value
StringBuffer jake = new StringBuffer("jake");
}
}
String和StringBuffer相互转换
package com.pero.stringbuffer_;
/**
* @author Pero
* @version 1.0
*/
public class StringBuffer03 {
public static void main(String[] args) {
//1.String -> StringBuffer
String str = "hello tom";
//方式1:使用构造器
//返回的才是stringBuffer对象,但是对str本身并无影响
StringBuffer stringBuffer = new StringBuffer(str);
//方式2:使用append方法
StringBuffer stringBuffer1 = new StringBuffer();
stringBuffer1 = stringBuffer1.append(str);
//StringBuffer ->String
StringBuffer pero = new StringBuffer("Pero");
//1.使用StringBuffer提供的toString方法
String s = pero.toString();
//2.使用String构造器
String s1 = new String(pero);
}
}
StringBuffer常用方法
package com.pero.stringbuffer_;
/**
* @author Pero
* @version 1.0
*/
public class StringBuffer04 {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("hello");
//增加
s.append(',');
s.append("张三丰");
s.append("赵敏").append(100).append(true).append(10.5);
System.out.println(s); //调用了toSting方法
//删除
/**
* 删除索引为start<=&&<end处的字符
*/
s.delete(11,14);
System.out.println(s);
//修改
//使用周芷若替换索引为9到11的字符(start<=&&<end处的字符)[9,11)
s.replace(9,11,"周芷若");
//查找
//查找指定的子串在字符串中第一次出现的索引,如果找不到返回-1
int index = s.indexOf("张三丰");
System.out.println(index);
//插入
//在索引指定一个位置插入字符串
s.insert(9,"赵敏");
System.out.println(s);
//所有增删改插,都是在原有的对象上进行,返回给对象
//长度
System.out.println(s.length());
System.out.println(s);
}
}
课后练习
package com.pero.stringbuffer_;
/**
* @author Pero
* @version 1.0
*/
public class StringBuffer05 {
public static void main(String[] args) {
String str = null;
StringBuffer stringBuffer = new StringBuffer();
//private AbstractStringBuilder appendNull() {
// int c = count;
// ensureCapacityInternal(c + 4);
// final char[] value = this.value;
// value[c++] = 'n';
// value[c++] = 'u';
// value[c++] = 'l';
// value[c++] = 'l';
// count = c;
// return this;
// }
stringBuffer.append(str); //将str以"null"字符串形式传进append()方法中
System.out.println(stringBuffer);
System.out.println(stringBuffer.length());
//public StringBuffer(String str) {
// super(str.length() + 16);
// append(str);
// }
//下面构造器会抛出空指针异常NullPointerException
StringBuffer stringBuffer1 = new StringBuffer(str);
System.out.println(stringBuffer1);
}
}