为了解决String字符串操作导致的内存冗余,提高效率,Java中提供了StringBuffer和StringBuilder来操作字符串,并且提供了很多方法,便于程序员开发。
StringBuffer和StringBuilder中都有char类型可变长数组作为字符串的保存空间。使用到的方法类型和ArrayList类似。
但两者又有不同:
StringBuffer 线程安全,效率较低
StringBuilder 线程不安全,效率较高
StringBuffer();
创建一个未存储任何字符串信息的空StringBuffer空间,底层初始化一个16个字符char类型数组
StringBuffer(String str);
根据提供的String类型字符串创建对应的StringBuffer空间,
底层char类型数组的容量会根据str.length + 16决定,并且保存对应的str
/*
* StringBuffer构造方法演示
* StringBuilder同理
*/
public class Demo1 {
public static void main(String[] args) {
StringBuffer stringBuffer = new StringBuffer();
StringBuffer stringBuffer2 = new StringBuffer("武汉加油!中国加油!!");
System.out.println(stringBuffer);
System.out.println(stringBuffer2.toString());
}
}
运行结果:
武汉加油!中国加油!!
append(Everything)
在StringBuffer和StringBuilder对象中,添加另外的数据,并且当做字符串处理。
insert(int index, Everything)
在StringBuffer和StringBuilder对象中,在指定的下标位置,添加其他内容,并且当做字符串处理
package stringBuffer;
import stringBuffer.Demo2;
/*
* StringBuffer append 和 insert方法演示
*/
public class Demo2 {
public static void main(String[] args) {
StringBuffer stringBuffer = new StringBuffer("123456789");
//添加字符串
stringBuffer.append("武汉加油,中国加油!");
stringBuffer.append(new Demo2());
System.out.println(stringBuffer);
StringBuilder stringBuilder = new StringBuilder("ABCDEFGHIJKLMN");
stringBuilder.insert(3, "---");
stringBuilder.insert(9, "===");
System.out.println(stringBuilder);
}
}
运行结果:
123456789武汉加油,中国加油!stringBuffer.Demo2@6d06d69c
ABC---DEF===GHIJKLMN
String toString();
将底层的char类型数组保存的字符内容转换成对应的String类型字符串返回
int length();
返回底层char类型数组中有多少有效元素。
String substring(int begin);
从指定位置开始获取到char类型数组有效元素末尾对应的字符串,截取操作,
String substring(int begin, int end);
从指定位置begin开始到end结束,获取对应的字符串,要头不要尾
int indexOf(String str);
指定元素字符串所在下标位置
int lastIndexOf(String str);
指定元素字符串最后一次所在下标位置
/*
* 查询方法
*/
public class Demo3 {
public static void main(String[] args) {
StringBuffer stringBuffer = new StringBuffer("12345中国加油6789");
//查询指定元素首次出现的下标位置
System.out.println(stringBuffer.indexOf("中国加油"));
//获取子集和
System.out.println(stringBuffer.substring(5));
System.out.println(stringBuffer.substring(5, 10));
System.out.println(stringBuffer.length());
}
}
运行结果:
5
中国加油6789
中国加油6
13
replace(int start, int end, String str);
从指定位置start开始,到end结束,start <= n < end, 使用str替换
replace(int start, int end, String str);
从指定位置start开始,到end结束,start <= n < end, 使用str替换
/*
* 修改方法
*/
public class Demo4 {
public static void main(String[] args) {
StringBuffer stringBuffer = new StringBuffer("123456789");
//替换指定下标范围的内容
stringBuffer.replace(1, 5, "中国加油");
System.out.println(stringBuffer);
//替换指定下标位置的元素
stringBuffer.setCharAt(6, 'A');
System.out.println(stringBuffer);
}
}
运行结果:
1中国加油6789
1中国加油6A89
delete(int start, int end);
删除指定范围以内的字符 start <= n < end
deleteCharAt(int index);
删除指定下标的字符
reverse();
逆序
/*
* 删除和逆序方法
*/
public class Demo5 {
public static void main(String[] args) {
StringBuffer stb = new StringBuffer("123456789");
//删除指定下标范围的元素(要头不要尾)
stb.delete(1, 5);
System.out.println(stb);
//删除指定下标元素
stb.deleteCharAt(1);
System.out.println(stb);
//逆序
stb.reverse();
System.out.println(stb);
}
}
运行结果:
16789
1789
9871