1 、什么是 StringBuffer
从开发角度来看,在实际的操作中经常会出现字符串内容循环修改的情况,但是如果此时直接使用 String 做,则代码性能会非常的低,因为 String 的内容不可改变。
所以在 java 中提供了一个可以修改的字符串类,此类称为 StringBuffer 。
在 String 中使用“ + ”号完成字符串的连接操作,那么在 StringBuffer 类中使用 append() 方法完成字符串的连接操作,StringBuffer 类定义在 java.lang 包中。
2、 String 和 StringBuffer 的区别
StringBuffer 类和 String 一样,也用来代表字符串,只是由于 StringBuffer 的内部实现方式和 String 不同,所以 StringBuffer 在进行字符串处理时,不生成新的对象,在内存使用上要优于 String 类 。
所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用 StringBuffer 要更加适合一些 。
在 StringBuffer 类中存在很多和 String 类一样的方法,这些方法在功能上和 String 类中的功能是完全一样的。但是有一个最显著的区别在于,对于 StringBuffer 对象的每次修改都会改变对象自身,这点是和 String 类最大的区别。
另外由于 StringBuffer 是线程安全的,所以在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。
在java中有3个类来负责字符的操作:
1.Character 是进行单个字符操作的,
2.String 对一串字符进行操作。不可变类。
3.StringBuffer 也是对一串字符进行操作,但是可变类 。
String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.
StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
ps:不能通过付值符号对他进行付值.
sb = "welcome to here!";//!!这样子是错误的
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
中付值的时候可以通过它的append方法.
sb.append("hello");
字符串连接操作中StringBuffer的效率要比String高:
String str = new String("welcome to ");
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.
并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的 .
根据上面所说:
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();
所以str += "here";可以等同于
StringBuffer sb = new StringBuffer(str);
sb.append("here");
str = sb.toString();
总结 : 如果在程序中需要对字符串进行频繁的修改连接操作的话 . 使用 StringBuffer 性能会更高
3 、 StringBuffer 的操作实例
3.1 、字符串连接 append()
public class StringBufferDemo01 {
public static void main(String[] args) {
StringBuffer buf = new StringBuffer();
buf.append("hello"); // 添加字符串
buf.append("world").append("!!!\n").append("JAVA"); // 字符串连接
System.out.println(buf) ;
String str = buf.toString();// 将StringBuffer变为String
System.out.println(str);
}
}
3.2 、字符串替换操作 replace()
public class StringBufferDemo03 {
public static void main(String[] args) {
StringBuffer buf = new StringBuffer();
buf.append("hello"); // 添加字符串
buf.append("world").append("!!!").append("JAVA"); // 字符串连接
buf.replace(0, 5, "lixinghua") ;
System.out.println(buf) ;
}
}
3.3 、字符串反转操作 reverse()
public class StringBufferDemo04 {
public static void main(String[] args) {
StringBuffer buf = new StringBuffer();
buf.append("hello"); // 添加字符串
buf.append("world").append("!!!").append("JAVA"); // 字符串连接
buf.reverse();// 字符串反转
System.out.println(buf);
}
}
3.4 、字符串增加操作 insert()
public class StringBufferDemo05 {
public static void main(String[] args) {
StringBuffer buf = new StringBuffer();
buf.append("world").append("!!!").append("JAVA"); // 字符串连接
buf.insert(0, "hello ").insert(5, "~~~") ;
System.out.println(buf);
}
}
3.5 、字符串截取操作 substring()
public class StringBufferDemo06 {
public static void main(String[] args) {
StringBuffer buf = new StringBuffer();
buf.append("world").append("!!!").append("JAVA"); // 字符串连接
buf.insert(0, "hello ").insert(5, "~~~") ;
System.out.println(buf.substring(10));
System.out.println(buf.substring(0,14));
}
}
总结:当你需要用字符串来处理大量数据的时候,一定要记得用StringBuffer而不是String,反之,两者均可用。
在Java中,有好多的对象彼此间像String和StringBuffer 一样很相似,在很多情况下两者所应用的效果也是非常类似没差别,只有在一些特殊的情况下,比如大量数据处理、高并发线程等等情况下,两者间的区别才非常明显地显现出来,这就是我们要在程序编写中尽量要意识到的问题。
参考博文:http://www.zihou.me/html/2011/01/27/2726.html
http://www.cnblogs.com/springcsc/archive/2009/12/03/1616330.html
http://wenku.baidu.com/view/7bdbd7651ed9ad51f01df2f4.html
http://www.moandroid.com/?p=1624
引申:java到底是按值传递还是按引用传递? http://topic.csdn.net/t/20060605/13/4801113.html
java到底是按值传递还是按引用传递?