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

String ,StringBuffer 和 StringBuilder 区别

2012-08-15 17:45 288 查看
在java中有3个类来负责字符的操作。

1.Character 是进行单个字符操作的,

2.String 对一串字符进行操作。不可变类。

3.StringBuffer 也是对一串字符进行操作,但是可变类。

String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.

StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
note:不能通过付值符号对他进行付值.
sb = "welcome to here!";//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
中付值的时候可以通过它的append方法.
sb.append("hello");

字符串连接操作中StringBuffer的效率要比String高:

String str = new String("welcome to ");
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.

并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.
从Java 5.0发布以后,我们的比较列表上将多出一个对象了,这就是StringBuilder类。String类是不可变类,任何对String的改变都会引发新的String对象的生成;而StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象,可变和不可变类这一对对象已经齐全了,那么为什么还要引入新的StringBuilder类干吗?相信大家都有此疑问,我也如此。下面,我们就来看看引入该类的原因。      为什么会出现那么多比较String和StringBuffer的文章?      原因在于当改变字符串内容时,采用StringBuffer能获得更好的性能。既然是为了获得更好的性能,那么采用StringBuffer能够获得最好的性能吗?      答案是NO!      为什么?      如果你读过《Think in Java》,而且对里面描述HashTable和HashMap区别的那部分章节比较熟悉的话,你一定也明白了原因所在。对,就是支持线程同步保证线程安全而导致性能下降的问题。HashTable是线程安全的,很多方法都是synchronized方法,而HashMap不是线程安全的,但其在单线程程序中的性能比HashTable要高。StringBuffer和StringBuilder类的区别也在于此,新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。package com.hct.test;import java.util.ArrayList;import java.util.Iterator;import java.util.List;/*** @author: chengtai.he* @created:2009-12-9 上午09:59:57*/public class StringBuilderTester {private static final String base = " base string. ";private static final int count = 2000000; public static void stringTest() {long begin, end;begin = System.currentTimeMillis();String test = new String(base);for (int i = 0; i < count/100; i++) {test = test + " add ";}end = System.currentTimeMillis();System.out.println((end - begin)+ " millis has elapsed when used String. ");} public static void stringBufferTest() {long begin, end;begin = System.currentTimeMillis();StringBuffer test = new StringBuffer(base);for (int i = 0; i < count; i++) {test = test.append(" add ");}end = System.currentTimeMillis();System.out.println((end - begin)+ " millis has elapsed when used StringBuffer. ");} public static void stringBuilderTest() {long begin, end;begin = System.currentTimeMillis();StringBuilder test = new StringBuilder(base);for (int i = 0; i < count; i++) {test = test.append(" add ");}end = System.currentTimeMillis();System.out.println((end - begin)+ " millis has elapsed when used StringBuilder. ");} public static String appendItemsToStringBuiler(List list) {StringBuilder b = new StringBuilder();  for (Iterator i = list.iterator(); i.hasNext();) {b.append(i.next()).append(" ");}  return b.toString();} public static void addToStringBuilder() {List list = new ArrayList();list.add(" I ");list.add(" play ");list.add(" Bourgeois ");list.add(" guitars ");list.add(" and ");list.add(" Huber ");list.add(" banjos ");  System.out.println(StringBuilderTester.appendItemsToStirngBuffer(list));} public static String appendItemsToStirngBuffer(List list) {StringBuffer b = new StringBuffer();  for (Iterator i = list.iterator(); i.hasNext();) {b.append(i.next()).append(" ");}  return b.toString();} public static void addToStringBuffer() {List list = new ArrayList();list.add(" I ");list.add(" play ");list.add(" Bourgeois ");list.add(" guitars ");list.add(" and ");list.add(" Huber ");list.add(" banjos ");  System.out.println(StringBuilderTester.appendItemsToStirngBuffer(list));} public static void main(String[] args) {stringTest();stringBufferTest();stringBuilderTest();addToStringBuffer();addToStringBuilder();}}上面的程序结果如下:5266 millis has elapsed when used String.375 millis has elapsed when used StringBuffer.281 millis has elapsed when used StringBuilder.I   play   Bourgeois   guitars   and   Huber   banjosI   play   Bourgeois   guitars   and   Huber   banjos从上面的结果来看,这三个类在单线程程序中的性能差别一目了然,采用String对象时,即使运行次数仅是采用其他对象的1/100,其执行时间仍然比其他对象高出25倍以上;而采用StringBuffer对象和采用StringBuilder对象的差别也比较明显,前者是后者的1.5倍左右。由此可见,如果我们的程序是在单线程下运行,或者是不必考虑到线程同步问题,我们应该优先使用StringBuilder类;当然,如果要保证线程安全,自然非StringBuffer莫属了。除了对多线程的支持不一样外,这两个类的使用几乎没有任何差别,上面的例子就是个很好的说明。appendItemsToStringBuiler和appendItemsToStirngBuffer两个方法除了采用的对象分别为StringBuilder和StringBuffer外,其他完全相同,而效果也完全相同
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: