您的位置:首页 > 产品设计 > UI/UE

String,StringBuffer,StringBuilder的区别

2013-04-12 14:18 197 查看
共同点:都是对字符串进行操作。

不同点:

1.String类对象内容不可以改变,默认为final,不可以被继承。而StringBuffer可以改变内容且效率比String类高

例如:String s=new String(a);

s=s+"c";//在内存中重新创建了一个String类型的对象并为其分配了地址

s+="b";//其实是new StringBuffer()对象后调用了append(),最终调用了new StringBuffer().toString();

StringBuffer sb=new StringBuffer("a");

a.append("b");//在原来的对象上进行修改,改变的是内容,在内存中的地址不变

String的操作都是改变赋值地址而不是改变值操作

2.equals()的区别:String类重写了equals(),比较的是对象的内容,StringBuffer类没有重写equals(),继承的是Object类的,比较的是对象的地址。

例如:

String s1=new String(“a");String s2=new String("a");s1.equals(s2);返回的是true;

StringBuffer sb1=new StringBuffer("a"); StringBufffer sb2=new StringBuffer("a"); sb1.equals(sb2);返回的是false;

3.连接字符的高效性:

StringBuffer类的append方法追加字符 比 String使用 + 操作符添加字符 到 一个已经存在的字符串后面有效率得

多。因为使用 + 操作符每一次将字符添加到一个字符串中去时,字符串对象都需要寻找一个新的内存空间来容纳更大

的字符串,这无凝是一个非常消耗时间的操作。添加多个字符也就意味着要一次又一次的对字符串重新分配内存。使

用StringBuffer类就避免了这个问题.

4.对象长度:

一个String对象的长度是固定的,不能改变它的内容,或者是附加新的字符至String对象中。您也许会使用+来串联字符串以达到附加新字符或字符串的目的,但+会产生一个新的String实例。如果程序对这种附加字符串的需求很频繁,并不建议使用+来进行字符串的串联。在面向对象程序设计中,最好是能重复运用已生成的对象,对象的生成需要内存空间与时间,不断地产生String实例是一个没有效率的行为。

J2SE 5.0提供java.lang.StringBuilder类,使用这个类所产生的对象默认会有16个字符的长度,您也可以自行指定初始长度。如果附加的字符超出可容纳的长度,则StringBuilder对象会自动增加长度以容纳被附加的字符。如果有频繁作字符串附加的需求,使用StringBuilder会让程序的效率大大提高。

5.线程安全性:

使用StringBuilder最后若要输出字符串结果,可以用toString()方法。可以使用length()方法得知目前对象中的字符长度,而capacity()可返回该对象目前可容纳的字符容量。另外,StringBuilder还有像insert()方法可以将字符插入指定的位置,如果该位置以后有字符,则将所有的字符往后移;deleteChar()方法可以删除指定位置的字符,而reserve()方法可以反转字符串。详细的使用可以查询java.lang.StringBuilder的API文件说明。

StringBuilder是J2SE 5.0才新增的类,在J2SE 5.0之前的版本若有相同的需求,则使用java.lang.StringBuffer。事实上,StringBuilder被设计为与StringBuffer具有相同的操作接口。在单机非多线程(Multithread)的情况下使用StringBuilder会有较好的效率,因为StringBuilder没有处理同步(Synchronized)问题。StringBuffer则会处理同步问题,如果StringBuilder会在多线程下被操作,则要改用StringBuffer,让对象自行管理同步问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: