这三个类都可以对字符串做处理。所不同的是,StringBuilder、StringBuffer相比String更加灵活,在创建完对象之后可以对对象进行插入、添加新的内容,而String对象一旦创建就不可更改。下面是StringBuilder和StringBuffer的具体用法:
构造方法:
StringBuilder() //构建一个容量为16的空字符串生成器
StringBuilder(int) //构建一个指定容量的字符串生成器
StringBuilder(String) //构建一个带指定字符串的字符串生成器
修改字符串的方法
append(char[ ]) //给这个字符串生成器追加一个字符数组
append(String) //将一个字符串追加到生成器
delete(startIndex,endIndex) //删除从startIndex到endIndex-1之间的字符
delete(int) //删除指定位置的字符
insert(index,String) //在指定位置插入字符串
replace(startIndex,endIndex,String) //在startIndex到endIndex-1范围内的字符用指定字符串替换
reverse() //颠倒生成器中的字符
setCharAt(index,char) //在指定下标用char做替换
除了StringBuffer中修改缓冲区的方法是同步的。StringBuffer类和StringBuilder类是很类似的。如果是多任务并发访问,使用StringBuffer;如果是单任务访问,使用StringBuilder更有效。也就是说,StringBuilder是线程不安全的,而StringBuffer中很多方法因为带有synchronized关键字,所以是线程安全的。
如果一个字符串不需要任何改变,则使用String类而不使用StringBuffer类。java可以对String做一些优化。
在运行速度方面StringBuilder>StringBuffer>String,之所以产生这样的原因主要是因为String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。以下解释参考酥风的解释:
1 String str="abc";
2 System.out.println(str);
3 str=str+"de";
4 System.out.println(str);
如果运行这段代码会发现先输出“abc”,然后又输出“abcde”,好像是str这个对象被更改了,其实,这只是一种假象罢了,JVM对于这几行代码是这样处理的,首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。