- 浏览: 144010 次
- 来自: ...
文章分类
最新评论
-
nocb:
太感谢了, 我调了2天,始终找不到原因,
DataOutputStream writeBytes(String s) 中文乱码--ZT -
jbeduhai:
发贴能成功吗,我执行的怎么是说没有登录呢,前面登录是正常的,发 ...
ZT---httpclient如何保持session会话模拟登录后的操作 -
chwanga:
很详细啊,廓然开朗,感谢楼主
filter servlet 区别--ZT -
JMS_Exception:
xvm03 写道promzaid 写道.net 还是 java ...
Java的字符流和字节流 -
xvm03:
promzaid 写道.net 还是 java java
Java的字符流和字节流
出于方便的考虑,我们在进行字符串的内容处理的时候往往会出现以下的代码:
String result="";
result+="ok";
这段代码看上去好像没有什么问题,但是需要指出的是其性能很低,原因是java中的String类不可变的(immutable),这段代码实际的工作过程会是如何的呢?通过使用javap工具我们可以知道其实上面的代码在编译成字节码的时候等同的源代码是:
String result="";
StringBuffer temp=new StringBuffer();
temp.append(result);
temp.append("ok");
result=temp.toString();s
StringBuffer与StringBuilder
相信大家看到过很多比较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高。如果你对此不太相信,可以试试下面的例子:
package com.jiang.tiger.chap1;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
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();
}
上面的程序结果如下:
11359millis has elapsed when used String.
344millis has elapsed when used StringBuffer.
234millis 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外,其他完全相同,而效果也完全相同。
发表评论
-
页面弹出登录框如何通过httpclient进行登录
2011-01-04 16:17 1361页面弹出登录框如何通过httpclient进行登录 h ... -
转贴--在Struts2的Action中取得请求参数值的几种方法
2010-10-27 18:33 1207在Struts2的Action中取得请求参数值的几 ... -
jdbc连接
2010-08-02 17:43 740Connection conn = null; ResultS ... -
几个需要仔细阅读的源码
2010-05-19 23:20 726OSGI spring jboss -
listener,filter区别--ZT
2010-04-28 16:05 1694web.xml里面可以配置Filter和Listen ... -
JDK 1.4中存在一个有关编--ZT
2010-04-23 21:30 1052在JDK 1.4中存在一个有关编码的问题。简要描述如下: ... -
Servlet不是单例的--ZT
2010-04-22 20:59 1900Servlet不是单例的.不过一般来说一个servlet只会有 ... -
java 多态的理解--ZT
2010-04-18 00:43 1087如何理解Java多态性?通过类型转换,把一个对 ... -
JAVA 深入学习
2010-04-17 14:37 819java 设计模式:策略模式(内部类的使用),装饰模式(IO) ... -
JAVA和JAVAC 命令行--ZZ
2009-09-27 15:45 874JAVA和JAVAC 命令行 ... -
jbpm工作流入门教程
2009-09-27 11:36 1950jbpm工作流入门教程 ... -
工作流学习-JBPM(一)
2009-09-27 11:25 819展翅飞翔 致力于J2EE与中间件整合方面的研 ... -
详细解析Java中抽象类和接口的区别
2009-03-03 20:38 687详细解析Java中抽象类和 ... -
比较Vector和ArrayList的不同
2009-03-03 20:35 1218――比较Vector和ArrayLi ... -
java面向对象浅析系列2
2009-03-03 20:21 700java面向对象浅析系列2——抽象类、接口与多继承 有时 ... -
java面向对象浅析系列1
2009-03-03 20:21 734java面向对象浅析系列1 ... -
java1.5线程池简单介绍
2009-03-03 20:17 2269JDK1.5中的线程池使用简介 在多线程大师Doug L ... -
一个JDBC简单连接
2009-03-03 20:04 718一个最基本的JDBC连接: Conn ... -
为什么要使用泛型?
2009-03-03 19:59 1484类型安全的List Java的一 ... -
泛型的注意事项
2009-03-03 19:58 9641、不可以用一个本地类 ...
相关推荐
String、StringBuffer和StringBuilder的比较 通过上面的分析,我们可以看到,String类的字符串是不可变的,而StringBuffer和StringBuilder类的字符串可以被修改。StringBuffer类是线程安全的,而StringBuilder类...
StringBuffer:字符创变量 StringBuilder:字符创变量 从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:
在Java编程语言中,String、StringBuilder和StringBuffer都是用来处理字符串的类,它们之间存在一些重要的区别,主要涉及到性能和线程安全性。 首先,`String`类代表的是字符串常量,一旦创建,其内容就不能改变。...
stringbuilder用法 String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String...
在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`是处理字符串的三个重要类,它们各自有特定的使用场景和优缺点。理解它们的差异对于编写高效的代码至关重要。 **String类** `String`是不可变的类,...
String, StringBuffer 与 StringBuilder 的区别 在 Java 中,String, StringBuffer 和 StringBuilder 三个类都是用于字符操作的,但它们之间有着很大的区别。 首先,String 是不可变类,意味着一旦创建了 String ...
在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的类,但它们之间存在显著的性能和功能差异。下面我们将深入探讨这三个类的区别。 首先,`String`类是Java中最基本的字符串类型,它表示...
String、StringBuffer 和 StringBuilder 是 Java 语言中三种不同类型的字符串处理方式,它们之间存在着明显的性能和线程安全性差异。 String String 类型是不可变的对象,每次对 String 对象进行改变时都会生成一...
在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`都是用来处理字符串的类,但它们之间存在显著的差异,主要体现在性能、线程安全性和使用场景上。 首先,`String`是最基本的字符串类,它代表的是不可...
string,stringbuffer,stringbuilder
string,stringBuffer,stringBuilder
Java 中 String, StringBuffer 与 StringBuilder 的区别 Java 中 String, StringBuffer 与 StringBuilder 三种字符串类型的区别是很多开发者经常混淆或不了解的知识点。今天,我们将深入探讨这三种字符串类型的区别...
String、StringBuilder、StringBuffer的区别 在 Java 中,String、StringBuilder 和 StringBuffer 三者都是字符串处理类,但是它们之间存在着本质的区别。本文将从执行速度、线程安全性、字符串处理方式等方面对这...
在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的重要类,它们各自具有不同的特性和使用场景。下面将详细解析这三个类的区别。 首先,`String`类是最基础的字符串处理类,它被设计为不...
Java中的字符串处理是编程中常见的任务,涉及到三个关键类:String、StringBuffer和StringBuilder。它们在功能上相似,但有着重要的区别,主要体现在字符串的可变性、线程安全性和性能方面。 1. 可变性 - String类...
在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的重要类,它们各自有特定的使用场景和特性。理解这三个类的区别对于任何Java开发者,无论是初学者还是经验丰富的程序员,都是非常重要的...
"Java 中 String、StringBuffer 和 StringBuilder 的区别及用法" Java 中 String、StringBuffer 和 StringBuilder 是三个常用的字符串操作类,了解它们之间的区别对 Java 开发者来说非常重要。本文将详细介绍这三者...
Java 中 String 和 StringBuffer 与 StringBuilder 的区别及使用方法 Java 中 String、StringBuffer 和 StringBuilder 是三个常用的字符串操作类,每个类都有其特点和使用场景。在开发过程中,正确选择合适的字符串...
String,StringBuilder,StringBuffer