StringBuffer:线程安全的可变字符串。
StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加合适一些。
在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的。
但是有一个最显著的区别在于,对于StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。另外由于StringBuffer是线程安全的,所以在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要慢一些。
上文引用链接:
http://www.cnblogs.com/springcsc/archive/2009/12/03/1616330.html
构造方法:
StringBuffer常用的构造方法:
public StringBuffer():无参构造方法
public StringBuffer(int capacity):指定容量的字符串缓冲区对象
public StringBuffer(String str):指定字符串内容的字符串缓冲区对象
StringBuffer的方法:
public int capacity():返回当前容量。 理论值(相当于瓶子容量)
public int length():返回长度(字符数)。 实际值(相当于瓶子里实际有多少水)
代码表现:
public class StringBufferDemo_01 {
public static void main(String[] args) {
StringBuffer sbf = new StringBuffer();
// 源码:
// public StringBuffer() {
// super(16);
// }
System.out.println("sbf:" + sbf);
System.out.println("sbf.capacity():" + sbf.capacity());
System.out.println("sbf.length():" + sbf.length());
System.out.println("--------------------------");
// public StringBuffer(int capacity):指定容量的字符串缓冲区对象
StringBuffer sbf2 = new StringBuffer(50);
// 源码:
// public StringBuffer(int capacity) {
// super(capacity);
// }
System.out.println("sbf2:" + sbf2);
System.out.println("sbf2.capacity():" + sbf2.capacity());
System.out.println("sbf2.length():" + sbf2.length());
System.out.println("--------------------------");
// public StringBuffer(String str):指定字符串内容的字符串缓冲区对象
StringBuffer sbf3 = new StringBuffer("hello");
// 源码:
// public StringBuffer(String str) {
// super(str.length() + 16);
// append(str);
// }
System.out.println("sbf3:" + sbf3);
System.out.println("sbf3.capacity():" + sbf3.capacity());
System.out.println("sbf3.length():" + sbf3.length());
}
}
输出:
sbf:
sbf.capacity():16
sbf.length():0
--------------------------
sbf2:
sbf2.capacity():50
sbf2.length():0
--------------------------
sbf3:hello
sbf3.capacity():21//16+5
sbf3.length():5
可见:
StringBuffer如同String一样样重写了toString()等方法;
在不同的构造方法中的capacity()方法返回值不一,默认16,在16的基础上变成指定容量或者在16的基础上增加相应长度。
StringBuffer的添加功能:
public StringBuffer append(String str):
可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
public StringBuffer insert(int offset,String str):
在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
public class StringBufferDemo_02 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
StringBuffer sb2 = sb.append("hello");
System.out.println("sb:" + sb);
System.out.println("sb2:" + sb2);
System.out.println(sb == sb2); // true
}
}
这里就可以看出StringBuffer与String的区别,String一般会在改变字符串后生成新的字符串对象,而StringBuffer不会!所以sb==sb2返回true!
public class StringBufferDemo_02 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
// 一步一步的添加数据
// sb.append("hello");
// sb.append(true);
// sb.append(12);
// sb.append(34.56);
// 也可以链式编程:
sb.append("hello").append(true).append(12).append(34.56);
System.out.println("sb:" + sb);
sb.insert(5, "world");
System.out.println("sb:" + sb);
}
}
输出:
sb:hellotrue1234.56
sb:helloworldtrue1234.56
StringBuffer的删除功能:
public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身
public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并返回本身
代码表现:
public class StringBufferDemo_03 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("hello").append("world").append("java");
System.out.println("sb:" + sb);
sb.deleteCharAt(1);
System.out.println("sb:" + sb);
sb.delete(5, 10);//包左不包右
System.out.println("sb:" + sb);
}
}
输出:
sb:helloworldjava
sb:hlloworldjava
sb:hllowava
对于方法:public StringBuffer delete(int start,int end)
end可以大于length,效果与end=length一样,不会报错
参见源代码:
public AbstractStringBuilder delete(int start, int end) {
if (start < 0)
throw new StringIndexOutOfBoundsException(start);
if (end > count)
end = count;//这里count==length
if (start > end)
throw new StringIndexOutOfBoundsException();
int len = end - start;
if (len > 0) {
System.arraycopy(value, start+len, value, start, count-end);
count -= len;
}
return this;
}
StringBuffer的替换功能:
public StringBuffer replace(int start,int end,String str):从start开始到end用str替换
public class StringBufferDemo_04 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("hello");
sb.append("world");
sb.append("java");
System.out.println("sb:" + sb);
sb.replace(5, 10, "你好");
System.out.println("sb:" + sb);
}
}
输出:
sb:helloworldjava
sb:hello你好java
StringBuffer的反转功能:
public StringBuffer reverse()
代码实现:
public class StringBufferDemo_05 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("eno2orez_avaj");
System.out.println("sb:" + sb);
sb.reverse();
System.out.println("sb:" + sb);
}
}
输出:
sb:eno2orez_avaj
sb:java_zero2one
StringBuffer的截取功能:
注意返回值类型不再是StringBuffer本身了,返回类型是String!
public String substring(int start)
public String substring(int start,int end)
代码实现:
public class StringBufferDemo_06 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("hello").append("world").append("java");
System.out.println("sb:" + sb);
String s = sb.substring(5);
System.out.println("s:" + s);
System.out.println("sb:" + sb);
String ss = sb.substring(5, 10);
System.out.println("ss:" + ss);
System.out.println("sb:" + sb);
}
}
输出:
sb:helloworldjava
s:worldjava
sb:helloworldjava
ss:world
sb:helloworldjava
这里可以看出:StringBuffer对象sb一直没有改变!