Java使用String StringBuffer StringBuilder总结
最近看了下java,刚刚看到String, StringBuffer, StringBuilder
1. String
String对象被创建,创建的字符串就不能被修改。
乍一看,好像是一个挺严重的限制。
但是,实际并非如此,还是可以执行字符串操作。区别是,当每次需要已存在的字符串的修改版本时,需要创建包含修改内容的新String对象,原始字符串保持不变。
1.1 String构造函数
// 第一种
String s = new String();
// 第二种
String(char chars[])
// 第三种
String(char chars[], int startIndex, int numChars)
// 第四种
String(String strObj)
1.2 字符串替换示例
public class StringRepalce {
public static void main(String[] args) {
String org = "This is a test, This is, too";
String search = "is";
String sub = "was";
String result = "";
int i;
// substring 两种重载方法
do {
System.out.println(org);
i = org.indexOf(search);
if (i != -1) {
result = org.substring(0, i); // substring 开始位置截取到结束位置
result = result + sub;
result = result + org.substring(i + search.length()); // substring 只填写开始位置, 会去截取开始位置到结尾
org = result;
}
} while (i != -1);
}
}
输出结果:
This is a test, This is, too
Thwas is a test, This is, too
Thwas was a test, This is, too
Thwas was a test, Thwas is, too
Thwas was a test, Thwas was, too
2. StringBuffer
StringBuffer允许中间插入字符和子串、或者再末尾追加字符和子串。
StringBuffer能够自动增长空间大小, 所以它会预先分配空间,并且允许空间增长。
2.1 StringBuffer构造函数
StringBuffer() // 默认构造函数预留16个字符的空间,不需要分配。
StringBuffer(int size) // 接收一个显示设置缓冲区大小的整型参数。
StringBuffer(String str) // 接收一个设置StringBuffer 对象初始化内容的String 参数, 并额外分配16个字符空间。
StringBuffer(CharSequence chars) // 创建包含字符序列的对象,并额外预留16个字符的空间,包含的字符序列是由chars指定的。
2.2 StringBuffer字符串可变长度示例
public class StringBufferDemo {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello");
System.out.println("buffer " + sb);
System.out.println("length " + sb.length());
System.out.println("capacity = " + sb.capacity()); // 默认长度是字符串长度 + 16 也就是5+16 = 21
sb.append(" ").append("Java").append("!");
System.out.println("buffer " + sb);
System.out.println("length " + sb.length());
System.out.println("capacity = " + sb.capacity()); // 没超过21的长度,不会增加
sb.append(" This is an");
System.out.println("buffer " + sb);
System.out.println("length " + sb.length());
System.out.println("capacity = " + sb.capacity()); // 如果长度超过21 (21+1)*2 = 44
sb.append("abcdefghijklmnopqrstuvwxyz");
System.out.println("buffer " + sb);
System.out.println("length " + sb.length());
System.out.println("capacity = " + sb.capacity()); // 再超过 (44+1)*2
}
}
输出结果:
buffer Hello
length 5
capacity = 21
buffer Hello Java!
length 11
capacity = 21
buffer Hello Java! This is an
length 22
capacity = 44
buffer Hello Java! This is anabcdefghijklmnopqrstuvwxyz
length 48
capacity = 90
capacity()
反馈的是字符串已分配的容量长度
可以看到每次超出原先分配内存的空间长度都是 (n+1)*2,n表示原先分配的长度
3. StringBuilder
StringBuffer和StringBuilder类似,但是StringBuilder不是同步的,它不是线程安全的。
StringBuilder优势:有更高的性能,字符串可以被多个线程修改。