基本介绍
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
使用示例:
|
|
方法:http://www.runoob.com/java/java-stringbuffer.html
深入理解
Java 提供的三种操作字符串对象的方法:String
、StringBuffer
、StringBuilder
。它们的相同点都是用来封装字符串,都实现了 CharSequence 接口。区别如下:
关于可变性:
String
是一个不可变类,创建之后直到销毁,这个对象都是不可被改变的;StringBuffer
、StringBuilder
都继承自AbstractStringBuilder
,它的底层使用字符数组保存字符串,是一个可变类。
关于初始化方法:
String
类可以使用直接赋值的方法进行初始化:String s = "Hello";
;StringBuffer
、StringBuilder
只能使用new
的这种构造方法赋值。
关于修改一个字符串,以字符串追加为例:
String
可以直接使用累加的方法:1
String str = "Hello,"; str += "World";
这种方法看起来很方便,实际上底层是销毁了原来的对象后创建了一个新的对象;
StringBuffer
、StringBuilder
等价于使用下面的代码:1
StringBuffer sb = new StringBuffer("Hello,"); sb.append("World");
因为前者的底层会进行一些额外的操作,所以即使将
sb
重新复制给 String,效率也更高。
关于一些原生的方法:
String
实现了equals()
方法与hashCode()
方法;StringBuffer
、StringBuilder
并没有实现这两个方法,也就是说:1 2 3
StringBuffer sb1 = new StringBuffer("Java"); StringBuffer sb2 = new StringBuffer("Java"); sb1.equals(sb2); // ==> false
关于是否线程安全:
StringBuffer
、StringBuilder
它们都提供了一系列插入追加改变字符串序列的方法,它们的用法基本相同。区别在于StringBuffer
是线程安全的,而StringBuilder
是线程不安全的。