浅谈StringBuffer

StringBuffer,由名字可以看出,是一个String的缓冲区,也就是说一个类似于String的字符串缓冲区,和String不同的是,它可以被修改,而且是线程安全的。StringBuffer在任意时刻都有一个特定的字符串序列,不过这个序列和它的长度可以通过一些函数调用进行修改。它的结构层次如下图:

 

StringBuffer是线程安全的,因此如果有几个线程同时操作StringBuffer,对它来说也只是一个操作序列,所有操作串行发生。

每一个StringBuffer都有一个容量,如果内容的大小不超过容量,StringBuffer就不会分配更大容量的缓冲区;如果需要更大的容量,StringBuffer会自动增加容量。和StringBuffer类似的有StringBuilder,两者之间的操作相同,不过StringBuilder不是线程安全的。虽然如此,由于StringBuilder没有同步,所以它的速度更快一些。

如上截图,StringBuffer是一个final 类【不能被继承,没有子类】,且继承了抽象类ABstracrStringBuilder并且实现了java io接口

注意看一些类文件上面的标注,since jdk1.0 就有StringBuffer, 而在网上要注解,在jdk5,该类得到一个补充,也就是常用来比较的StringBuilder,单个线程,速度更快,不执行同步,建议优先使用StringBuilder 巴拉巴拉

 

 

        StringBuffer sb1 = new StringBuffer();
        sb1.append('a');
        sb1.append(11);
        System.out.println(sb1.toString());


        StringBuffer sb2 = new StringBuffer("a11");
        System.out.println(sb2.toString());



        //StringBuffer和String属于不同的类型,也不能直接进行强制类型转换,下面的代码都是错误的
        sb2 ="222";
        sb2 =(StringBuffer)"333";


        //tringBuffer对象和String对象之间的互转的代码如下
        String s = "a11";
        StringBuffer sb11 = new StringBuffer("a11");
        StringBuffer sb12 = new StringBuffer(s); //String转换为StringBuffer
        String s1 = sb1.toString(); //StringBuffer转换为String

  

2、StringBuffer的常用方法
StringBuffer类中的方法主要偏重于对于字符串的变化,例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别。

a、append方法
public StringBuffer append(boolean b)

该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接。调用该方法以后,StringBuffer对象的内容也发生改变,例如:

StringBuffer sb = new StringBuffer(“abc”);

sb.append(true);

则对象sb的值将变成”abctrue”。

使用该方法进行字符串的连接,将比String更加节约内容,例如应用于数据库SQL语句的连接,例如:

StringBuffer sb = new StringBuffer();

String user = “test”;

String pwd = “123”;

sb.append(“select * from userInfo where username=“)

.append(user)

.append(“ and pwd=”)

.append(pwd);

这样对象sb的值就是字符串“select * from userInfo where username=test and pwd=123”。

b、deleteCharAt方法
public StringBuffer deleteCharAt(int index)

该方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串。例如:

StringBuffer sb = new StringBuffer(“Test”);

sb. deleteCharAt(1);

该代码的作用删除字符串对象sb中索引值为1的字符,也就是删除第二个字符,剩余的内容组成一个新的字符串。所以对象sb的值变为”Tst”。

还存在一个功能类似的delete方法:

public StringBuffer delete(int start,int end)

该方法的作用是删除指定区间以内的所有字符,包含start,不包含end索引值的区间。例如:

StringBuffer sb = new StringBuffer(“TestString”);

sb. delete (1,4);

该代码的作用是删除索引值1(包括)到索引值4(不包括)之间的所有字符,剩余的字符形成新的字符串。则对象sb的值是”TString”。

c、insert方法
public StringBuffer insert(int offset, boolean b)

该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串。例如:

StringBuffer sb = new StringBuffer(“TestString”);

sb.insert(4,false);

该示例代码的作用是在对象sb的索引值4的位置插入false值,形成新的字符串,则执行以后对象sb的值是”TestfalseString”。

d、reverse方法
public StringBuffer reverse()

该方法的作用是将StringBuffer对象中的内容反转,然后形成新的字符串。例如:

StringBuffer sb = new StringBuffer(“abc”);

sb.reverse();

经过反转以后,对象sb中的内容将变为”cba”。

e、setCharAt方法
public void setCharAt(int index, char ch)

该方法的作用是修改对象中索引值为index位置的字符为新的字符ch。例如:

StringBuffer sb = new StringBuffer(“abc”);

sb.setCharAt(1,’D’);

则对象sb的值将变成”aDc”。

f、trimToSize方法
public void trimToSize()

该方法的作用是将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。

g、toString()方法
该方法是将StringBuffer对象转化为字符串类型。
总之,在实际使用时,String和StringBuffer各有优势和不足,可以根据具体的使用环境,选择对应的类型进行使用。

 

3、常用方法

(1)构造函数

StringBuffer有四个构造函数:

StringBuffer() value内容为空,并设置容量为16个字节;
StringBuffer(CharSequece seq)  使用seq初始化,容量在此基础上加16;
StringBuffer(int capacity) 设置特定容量;
StringBuffer(String str)  使用str初始化,容量str大小的基础上加16;
(2)append方法

由于继承了Appendable接口,所以要实现append方法,StringBuffer类对几乎所有的基本类型都重载了append方法:

append(boolean b)
append(char c)
append(char[] str)
append(char[] str,int offset,int len)
append(CharSequence s)
append(CharSequence s,int start,int end)
append(double d)
append(float f)
append(int i)
append(long lng)
append(Object obj)
append(String str)
append(StringBuffer sb)
(3)insert方法

insert方法可以控制插入的起始位置,也几乎对所有的基本类型都重载了insert方法:

insert(int offser,boolean b)
insert(int offset,char c)
insert(int offset,char[] str)
insert(int index,char[] str,int offset,int len)
insert(int dsfOffset,CharSequence s)
insert(int dsfOffset,CharSequence s,int start,int end)
insert(int offset,double d)
insert(int offset,float f)
insert(int offset,int i)
insert(int offset,long l)
insert(int offset,Object obj)
insert(int offset,String str)
(4)其它会改变内容的方法

上面的那些方法会增加StringBuffer的内容,还有一些方法可以改变StringBuffer的内容:

StringBuffer delete(int start,int end) 删除从start到end(不包含)之间的内容;
StringBuffer deleteCharAt(int index) 删除index位置的字符;
StringBuffer replace(int start,int end,String str) 用str中的字符替换value中从start到end位置的子序列;
StringBuffer reverse() 反转;
void setCharAt(int index,char ch) 使用ch替换位置index处的字符;
void setLength(int newLength) 可能会改变内容(添加'\0');
(5)其它常用方法

下面这些方法不会改变内容:

int capacity() 返回value的大小即容量;
int length() 返回内容的大小,即count;
char charAt(int index) 返回位置index处的字符;
void ensureCapacity(int minimumCapacity) 确保容量至少是minimumCapacity;
void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin) 返回srcBegin到srcEnd的字符到dst;
int indexOf(String str) 返回str第一次出现的位置;
int indexOf(String str,int fromIndex) 返回从fromIndex开始str第一次出现的位置;
int lastIndexOf(String str) 返回str最后出现的位置;
int lastIndexOf(String str,int fromIndex) 返回从fromIndex开始最后一次出现str的位置;
CharSequence subSequence(int start,int end) 返回字符子序列;
String substring(int start) 返回子串;
String substring(int start,int end) 返回子串;
String toString() 返回value形成的字符串;
void trimToSize() 缩小value的容量到真实内容大小;
4、与String和StringBuilder的区别
三者都是处理字符串常用的类,不同在于:
速度上:String<StringBuffer<StringBuilder;
安全上:StringBuffer线程安全,StringBuilder线程不安全;
原因在于,String的每次改变都会涉及到字符数组的复制,而StringBuffer和StringBuilder直接在字符数组上改变;同时,StringBuffer是线程安全的,而StringBuilder线程不安全,没有StringBuffer的同步,所以StringBuilder快于StringBuffer。

总结:
如果对字符串的改变少,使用String;
如果对字符串修改的较多,需要线程安全就用StringBuffer,不需要就使用StringBuilder。

 

  

 

posted @ 2019-04-01 15:36  巴黎爱工作  阅读(775)  评论(0编辑  收藏  举报