关于StringBuffer类和String类,估计很多人都没去细索两者之前的区别以及何时用此何时用彼。确实,StringBuffer能实现的,String基本都能实现,对于不追求品质,不关注性能安全的即兴发挥家们来说,都是一样用。
首先StringBuffer类和String一样,都是用来代表字符串的,但是StringBuffer的内部实现方式是不一样的,StringBuffer在处理字符串时不用生成新的对象,在内存占用上要比String类更优。所以,如果需要对一个字符串,经常性的修改,如加长,缩短,插入等,最好还是使用StringBuffer类,其实这也是StringBuffer被赋予的主要使命。
在StringBuffer类中存在很多和String类一样的方法,这些方法功能上和String类是一样的,但是有一点,StringBuffer对象每次进行修改,都是修改的对象本身,这点和String类是有区别的;还有,StringBuffer类和String类之前不存在继承关系,所以两者之间也不能进行强制转换;另外,StringBuffer是线程安全的,即多线程操作时不会影响其值,当然,安全是需要牺牲效率的。
StringBuffer类的初始化
StringBuffer类初始化不像String,StringBuffer是需要使用其构造方法来生成一个对象才能使用的,如下:
StringBuffer sb = new StringBuffer(); //初始化一个空的对象
StringBuffer sb = new StringBuffer("vip"); //初始化一个对象,该对象包含字串"vip"
像如下初始化是错误的:
StringBuffer sb = "vip"; //错误!!!
StringBuffer类与String类之间的相互转换
上面说了,StringBuffer与String类直接是不能强制转换的,即如下代码非法:
StringBuffer sb = (StringBuffer)"vip"; //错误,不存在继承关系
如下转换才是正确的:
String str = "vip";
StringBuffer sb = new StringBuffer(str); //String转换为StringBuffer
String str1 = sb.toString(); //StringBuffer转换为String
StringBuffer的常用方法
1) append方法
public StringBuffer append(boolean b);
public StringBuffer append(int i);
public StringBuffer append(char c);
public StringBuffer append(char[] str);
public StringBuffer append(char[] str, int offset, int len);
public StringBuffer append(float f);
public StringBuffer append(double d);
public StringBuffer append(long l);
public StringBuffer append(Object obj);
public StringBuffer append(String str);
public StringBuffer append(StringBuffer sb);
这些方法都是向字符串缓冲区追加元素,但是这个元素可以是如上任意一种类型,如
StringBuffer sb = new StringBuffer("vip");
sb.append(true); //sb内容变成"viptrue"
2) capacity方法
int capacity();
返回当前StringBuffer对象(字符串缓冲区)的总空间,并不是字符串的长度。
3) length方法
int length();
这个才是返回当前字符串的长度。
4) charAt方法
char charAt(int index);
不用多说,String类中也有该方法,返回索引号为index处的字符,index从0开始。
5) setCharAt方法
void setCharAt(int index, char ch);
设置索引号index的字符为ch。
6) deleteCharAt方法
StringBuffer deleteCharAt(int index); //不用多说
7) delete方法
StringBuffer delete(int start, int end);
不用多说,看名字也知道,删除索引号start到end之间的字串,另外特别注意,这是个左闭右开区间,即“start <= 删除字符的索引号 < end”。
8) ensureCapacity方法
void ensureCapacity(int minimumCapacity);
重置字串缓冲区总空间,如果minimumCapacity小于当前总空间,则新的总空间不变;如果minimumCapacity大于当前空间但是小于“(当前空间 + 1)* 2”,则新的空间被设置为“(老空间 + 1) * 2”;如果minimumCapacity比前面情况更大,则新空间变为minimumCapacity。即ensureCapacity只允许增大空间,不允许缩小。
9) setLength方法
void setLength(int newLength);
重新设置字符串缓冲区中字符串的长度,如果newLength小于当前的字符串长度,将截去多余的字符。
10) getChars方法
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin);
从当前StringBuffer对象的索引号srcBegin开始到srcEnd结束的字串,拷贝到字符数组dst中,并且从字符数组的dstBegin处开始拷贝。
11) indexOf方法
int indexOf(String str); //返回当前StringBuffer中第一个满足str字串的位置
int indexOf(String str, int fromIndex); //功能同上,只是从fromIndex处开始找
12) lastIndexOf方法
int lastIndexOf(String str); //返回当前StringBuffer中最后一个满足str字串的位置
int lastIndexOf(String str, int fromIndex); //功能同上,只是从fromIndex处开始找
13) insert方法
StringBuffer insert(int offset, boolean b);
StringBuffer insert(int offset, char c);
StringBuffer insert(int offset, char[] str);
StringBuffer insert(int index, char[] str, int offset, int len);
StringBuffer insert(int offset, double d);
StringBuffer insert(int offset, float f);
StringBuffer insert(int offset, int i);
StringBuffer insert(int offset, long l);
StringBuffer insert(int offset, Object obj);
StringBuffer insert(int offset, String str);
这些方法都是在当前StringBuffer对象中插入一个元素,在索引号为offset处插入。
14) replace方法
StringBuffer replace(int start, int end, String str);
替换当前StringBuffer对象的字符串。从start开始,到end结束的位置替换成str。
15) reverse方法
StringBuffer reverse();
将字符串翻转。
16) substring方法
String substring(int start); //取当前StringBuffer对象中,从start开始到结尾的子串。
String substring(int start, int end); //取当前StringBuffer对象中,从start开始到end的子串。
17) toString方法
String toString();
将当前StringBuffer对象转换成String对象。