相信大家看到过很多比较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. 第一阶段Sprint 对其他团队评价

    咱们的team 针对对“小学生网页四则运算”这个产品的评审,本人提出建议:1.第一阶段的产品Sprint不够好,无任务看板.无燃尽图.希望完善该产品的的Sprint,第二阶段的Sprint要认真写好. ...

  2. 算法复习——迭代加深搜索(骑士精神bzoj1085)

    题目: Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相 ...

  3. 转载:C++读取特定路径下文件目录及文件名称

    转载地址:http://www.cnblogs.com/tgyf/p/3839894.html void getAllFiles( string path, vector<string>& ...

  4. 16.1116 NOIP 考前模拟(信心题)

    分火腿 (hdogs.pas/.c/.cpp) 时间限制:1s:内存限制 64MB 题目描述: 小月言要过四岁生日了,她的妈妈为她准备了n根火腿,她想将这些火腿均分给m位小朋友,所以她可能需要切火腿. ...

  5. Codevs 1026 逃跑的拉尔夫

     时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且 ...

  6. 【Eclipse】eclipse部署web项目至本地的tomcat但在webapps中找不到

    clipse部署web项目至本地的tomcat但在webapps中找不到 1.发现问题 在我的 eclipse 中有个Dynamic Web Project(动态web项目),在本地的 tomcat ...

  7. R语言入门--画图(一)--需要注意的地方

    一.注意‘\t’是‘\t’     不是‘/t’  写'/t'就错了   就不是换行符了 二.程序报错先检查有没有这个包

  8. [UIScreen mainScreen].applicationFrame与[UIScreen mainScreen].bounds区别

    [UIScreen mainScreen].applicationFrame与[UIScreen mainScreen].bounds区别: applicationFrame会自动判断是否存在状态栏, ...

  9. Java学习:二 基础

    2014 - 5 - 22 上午 Java对大小写敏感.   点号(.)用于调用方法,Java的能用语法是: object.method(parameters);   Java中的常量声明使用fina ...

  10. 三类(创结行),23种设计模式,速记理解法!PHP

    一,创建型设计模式 1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了.麦当劳 ...