相信大家看到过很多比较String和StringBuffer区别的文章,也明白这两者的区别,然而自从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高。如果你对此不太相信,可以试试下面的例子:

String是不可变的,StringBuffer和StringBuilder是可变的

但是区别在于:

StringBuffer是线程安全的,StringBuilder类不是线程安全的

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 banjos

I play Bourgeois guitars and Huber banjos

从上面的结果来看,这三个类在单线程程序中的性能差别一目了然,采用String对象时,即使运行次数仅是采用其他对象的1/100,其执行时间仍然比其他对象高出25倍以上;而采用StringBuffer对象和采用StringBuilder对象的差别也比较明显,前者是后者的1.5倍左右。由此可见,如果我们的程序是在单线程下运行,或者是不必考虑到线程同步问题,我们应该优先使用StringBuilder类;当然,如果要保证线程安全,自然非StringBuffer莫属了。

除了对多线程的支持不一样外,这两个类的使用几乎没有任何差别,上面的例子就是个很好的说明。appendItemsToStringBuiler和appendItemsToStirngBuffer两个方法除了采用的对象分别为StringBuilder和StringBuffer外,其他完全相同,而效果也完全相同。

String,StringBuilder与StringBuffer的区别的更多相关文章

  1. String, StringBuilder 与StringBuffer的区别与联系

    1.区别 (1)String构建的对象不能改变,每次对String进行操作时,如两个String相加,需要新建一个String对象,然后容纳最终的结果. 而StringBuilder与StringBu ...

  2. String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)

    本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...

  3. String、StringBuilder和StringBuffer的区别

    1         String.StringBuilder和StringBuffer的区别 String.StringBuilder.StringBuffer都可以用来保存字符串.如果是使用次数比较 ...

  4. String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别

    本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...

  5. 面试必知:String、StringBuilder、StringBuffer的区别

    你知道String.StringBuilder.Stringbuffer的区别吗?当你创建字符串的时候,有考虑过该使用哪个吗? 别急,这篇文章带你解决这些问题. 可变性 首先,String是字符串,我 ...

  6. JAVA String介绍、常量池及String、StringBuilder和StringBuffer得区别. 以及8种基本类型的包装类和常量池得简单介绍

    一.概述 String是代表字符串的类,本身是一个最终类,使用final修饰,不能被继承. 二.定义方式   方式一:直接赋值法 String str1 = "hello"; 方式 ...

  7. StringBuilder与StringBuffer的区别

    相信大家看到过很多比较String和StringBuffer区别的文章,也明白这两者的区别,然而自从Java 5.0发布以后,我们的比较列表上将多出一个对象了,这就是StringBuilder类.St ...

  8. StringBuilder和StringBuffer的区别

    Java中StringBuilder和StringBuffer的区别分析 StringBUilder是线程不安全的(线程同步访问的时候会出问题),但是效率相对较高. (String类型使用加号进行拼接 ...

  9. Java基础(32):String与StringBuilder、StringBuffer的区别(String类)

    在Java中,除了可以使用 String 类来存储字符串,还可以使用 StringBuilder 类或 StringBuffer 类存储字符串,那么它们之间有什么区别呢? String 类具有是不可变 ...

随机推荐

  1. 【Android】SharedPreference存储数据

    SharedPreference存储数据 使用SharedPreference保存数据  putString(key,value) 使用SharedPreference读取数据  getString( ...

  2. nginx进程属主问题讨论

    文章作者:luxianghao 文章来源:http://www.cnblogs.com/luxianghao/p/6107096.html 转载请注明,谢谢合作. 免责声明:文章内容仅代表个人观点,如 ...

  3. 【Luogu】P1383高级打字机

    可持久化线段树模板题之一. 权当温习主席树模板 #include<cstdio> #include<cstdlib> #include<cctype> #defin ...

  4. uva 10561 sg定理

    Problem C Treblecross Input: Standard Input Output: Standard Output Time Limit: 4 Seconds Treblecros ...

  5. 费用流(bzoj 3130)

    Description Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识.    最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量.一个合法的网络 ...

  6. 51nod1026 矩阵中不重复的元素 V2

    $n \leq 500000,m \leq 500000$的矩阵,第一行第一列是$a^b,2 \leq a,b \leq 500000$,如果一个数是$i^j$那他右边是$i^{j+1}$,下面是${ ...

  7. PatentTips - Optimizing Write Combining Performance

    BACKGROUND OF THE INVENTION The use of a cache memory with a processor facilitates the reduction of ...

  8. T3139 栈练习3 codevs

    http://codevs.cn/problem/3139/ 题目描述 Description 比起第一题,本题加了另外一个操作,访问栈顶元素(编号3,保证访问栈顶元素时或出栈时栈不为空),现在给出这 ...

  9. pandaboard用wifi时打不开网页

    不可以手动修改/etc/resolv.conf,因为重启会被自动清空(raspberry pi 可以) 修改 resolvconf服务的配置文件: /etc/resolvconf/resolv.con ...

  10. Codeforces 961 D Pair Of Lines

    题目描述 You are given nn points on Cartesian plane. Every point is a lattice point (i. e. both of its c ...