一、StringBuffer
API解释:
它是线程安全(Synchronized)的可变字符串。可以通过某些方法调用来改变序列的长度和内容。
StringBuffer的主要操作是append和insert方法,它们可以被重载使得可以接受所有数据类型,任何给定的数据类型都会被有效地转化为一个String字符串并被添加到StringBuffer字符串缓冲区的后面。
append方法总是将这些字符添加到字符串缓冲区的末端。insert方法则将字符添加到特定的位置。
eg:有一个StringBuffer对象z,内容为”start”,当执行z.append(“le”)后:z为”startle”;当执行z.insert(4,”le”)后:z为”starlet”
tips:在下标对应的位置前插入。
每个StringBuffer都有一个容量。只要字符串长度不超过容量就不会分配新的内部缓冲区。如果内容溢出了,它会自动扩容。
JDK5新增了一个等效的类StringBuilder,它使用单线程。往往使用StringBuilder更多,因为二者功能相同,而StringBuilder不使用Synchronization,速度更快!。
构造函数:
StringBuffer():构造默认容量为16字符无内容的可变字符串。
StringBuffer(int capacity):构造无内容的指定容量的可变字符串。
StringBuffer(String str):构造一个初始化为给定字符串的可变字符串。初始化容量为16加上给定字符串的长度。
StringBuffer(CharSequence seq):构造含有给定字符序列的可变字符串。初始化容量为16加上给定字符序列的长度。
常用方法:
(1)toString方法可以将该字符串缓冲区(容器)变为字符串。
(2)append()、insert()。可以插入任意类型数据,自动转换为String并添加进去。
(3)删除:delete(int start,int end)删除指定开始结束位置间的字符,含头不含尾。
(4)获取:charAt(int index)获取index上的字符;indexOf(String str)获取str第一次出现的位置。
(5)修改:replace(int start,int end,String str)将start开始到end的字符串替换为string;setCharAt(int index,char ch)将index位置的字符替换为ch
(6)反转:reverse();
(7)getChars(int srcBegin, int srcEnd, char[] dst,int dstBegin):将index为srcBegin到srcEnd-1的序列复制到dstBegin开始的数组中。
二、StringBuilder(JDK5.0)
字符串变量(非线程安全)。该类为StringBuffer的一个简易替换,在单线程时候使用效率更高。
三、String
字符串常量,字符串长度不可变。java中的String是immutable(不可变)的。
四、区别:
首先String类型是不可变的,它的底层实现是数组,数组可以被改变但是存放字符的数组在String类中被声明为私有,外部无法访问自然也无法修改。当我们对String类型进行改变的时候都会生成一个新的String对象返回。因此在需要经常改变字符串内容的时候最好不要使用String。
字符串的concatenation(+)操作符:
有两种情况:
(1)字符串常量拼接:
String str=”hello”+”word”;
JVM对字符串进行了优化,在编译时str就被优化为”hello word”
(2)字符串对象间的拼接:
String str1=”hello”;
String str2=”word”;
String str3=str1+str2;
底层调用StringBuffer的appen方法。过程如下:
StringBuffer sb=new StringBuffer(“”);
sb.append(str1);
sb.append(str2);
str4=sb.toString();
选择策略:
(1)String适合操作需要少量修改的数据。StringBuffer适合多线程大量操作的数据。StringBuilder适合单线程大量操作的数据。
(2)实际使用中尽量少使用+来进行频繁的连接。因为使用String的+操作符会导致多次创建String类对象,而是用StringBuilder则不会再重新创建对象。
(3)在使用字符串缓冲时尽量指定容量,如果需要操作的字符串长度小于16则无需考虑此问题。
(4)由于StringBuilder线程不安全。因此一般使用在方法内部来完成类似“+”的功能。而StringBuffer一般使用在全局变量中。
参考资料:
http://blog.csdn.net/kingzone_2008/article/details/9220691
JavaAPI文档