0 0

高分求证:StringBuffer和String的性能比较30

先前看到论坛中有人说JDK5下,String的连加操作会被JVM优化为StringBuffer.append()操作,因此拼装String时,两者的性能是一样的。今天闲着没事,写了段小程序测试了一下,对字母A进行1100次拼接,发现StringBuffer的性能比String连加要高出将近100倍,不知是怎么回事。各位给看看,附件是我的测试程序。

问题补充:添加了附件

问题补充:再次添加附件

问题补充:晕,附件添加不进来,直接上程序。

public class Test {

	public static void main(String[] args) {
		new Test().test();
	}
	
	public void test() {
		test1();
		test3();
	}
	
	
	private void test1() {
		long t1 = System.nanoTime();
		String aa = "";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";
		long t2 = System.nanoTime();
		System.out.println("连加:" + (t2 - t1)/1000000.0);
	}
	
	private void test3() {
		long t1 = System.nanoTime();
		StringBuffer buffer = new StringBuffer();
		for(int i = 0; i < 1100; i++) {
			buffer.append("A");
		}
		long t2 = System.nanoTime();
		System.out.println("buffer:" + (t2 - t1)/1000000.0);
	}
}


问题补充:
引用

其实,我更想问的是,为啥之前你不用循环

因为之前看到的帖子上说,JVM不会优化for循环内的String连加操作,所以才会不厌其烦的写了1100个连加。

引用

在字符串修改操作频繁的情况下, 肯定是 StringBuffer 的性能优于 String 的性能.
StringBuffer 出现的目的就是为了改进 String 的缺点

只不过 StringBuffer 是线程安全的, 它会在线程控制方面额外用力, 如果是单线程环境下频繁操作字符串, 可以使用 StringBuilder

这个我知道,我想问的是,之前别的帖子上说,JDK5下JVM会将String连加优化为StringBuilder.append()操作,这样的话,上面的测试中,两者的耗时应该是很接近的,但实际却不是这样,不解。


问题补充:
引用

引用
这个我知道,我想问的是,之前别的帖子上说,JDK5下JVM会将String连加优化为StringBuilder.append()操作,这样的话,上面的测试中,两者的耗时应该是很接近的,但实际却不是这样,不解。

他这么说有给出他的依据么? 这个可以咨询他一下的.
但是据我查看 JDK 5 的 changenote, 是没有提到 String 的这一优化方式的.
http://java.sun.com/j2se/1.5.0/ReleaseNotes.html#intro

这个是原帖,倒数第三楼。
http://www.iteye.com/topic/585121

引用
为啥你那么纠结性能?既然你知道StringBuffer 和 String 在处理不同问题上的优点.为啥你还要去关注性能呢?不解!

如果说JDK5下两者的性能一样的话,那以后编程过程中就不用刻意使用StringBuffer了,String连加不是更方便吗?这才是我要验证这个说法的最终目的。

引用
很明显这位大神在浪费时间。。。

哎,世风日下!

问题补充:
引用

如果官方没有文档的话,
1) 可以咨询这个讨论主题里提出这个观点的人
2) 搜索相关主题

因为在这里, 很难遇到对这个在官方文档都没有提及的问题有深入了解的人


这两步现在都做了,原帖中的当事人还没有回复。
这个优化在官方文档是否有说明,不太清楚。但在网上一搜,很多帖子都谈到了这个问题,应该不是以讹传讹吧,呵呵。
刚才又看到一篇帖子,貌似解释的不错,可以参照下:
http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380147d8c8c4668d4e419ce3b4c413037bfa6663f405a8e906b6075a81e0fb9f367263c0123b59999cf1d8dac925f75ce786a6459db0144dc41eb945125b061d61ab2f34cf0ba8173d5ee898f8a04149e07523a&p=b47ac800c5d912a058bd9b7d0d48&user=baidu

可能我的程序中不应该使用+=号。

问题补充:
引用

你在看一下,别的帖子说的String连加会不会是
aa="A"+"A"+"A"+"A"+"A"+"A"+"A"+"A"+"A"+"A"+"A"+"A"
而不是
aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";

呵呵,好像确实是这样。第二种会多创建出很多小对象。

引用

我记得当时我侧过10w循环的测试
String 和StringBuffer 时间没有任何差别!!
我不知道你是怎么测得啊

如上,估计是测试程序的问题。
2010年7月07日 20:59

13个答案 按时间排序 按投票排序

0 0

采纳的答案

JVM优化是对的,我这里没有JDK5.0.用的是6.0测试的,6.0对于String的连加采用的是StringBuilder优化的,按说优化了为什么StringBuffer的性能还是那么好呢。下面就分析一下。测试用例如下:

/**
 * @author 飞雪无情
 * @since 2010-7-10
 */
public class TestStringBuffer {

	public void testString(){
		String s="";
		for(int i=0;i<10000;i++){
			s+=i;
		}
	}
	public void testStringBuffer(){
		StringBuffer s=new StringBuffer("");
		for(int i=0;i<10000;i++){
			s.append(i);
		}
	}

}

这两个函数分别演示了string的连加和StringBuffer操作,执行测试,我本机上testString()600多毫秒,testStringBuffer()不超过20毫秒。下面就分析为什么,我们采用JDK的反汇编工具javap,执行javap -c  TestStringBuffer后我们看到CMD输出,我们挑重要的看,先看方法testString。
public void testString();
  Code:
   0:   ldc     #19; //String
   2:   astore_1
   3:   iconst_0
   4:   istore_2
   5:   goto    30
   8:   new     #21; //class java/lang/StringBuilder
   11:  dup
   12:  aload_1
   13:  invokestatic    #23; //Method java/lang/String.valueOf:(Ljava/lang/Objec
t;)Ljava/lang/String;
   16:  invokespecial   #29; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
   19:  iload_2
   20:  invokevirtual   #32; //Method java/lang/StringBuilder.append:(I)Ljava/la
ng/StringBuilder;
   23:  invokevirtual   #36; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
   26:  astore_1
   27:  iinc    2, 1
   30:  iload_2
   31:  sipush  10000
   34:  if_icmplt       8
   37:  return

我就不一行行分析了,有兴趣的可以看看相关知识,分析关键的,循环从“2:”开始到“34:”看第“8:”,创建了一个StringBuilder,然后使用append方法("第20:")进行String连加的优化,最要注意的是 创建这个StringBuilder,是在循环里面,也就是说我们循环多少次就会创建多少个StringBuilder,这就很影响性能(创建对象是很耗性能的).然后我们看testStringBuffer方法。
public void testStringBuffer();
  Code:
   0:   new     #46; //class java/lang/StringBuffer
   3:   dup
   4:   ldc     #19; //String
   6:   invokespecial   #48; //Method java/lang/StringBuffer."<init>":(Ljava/lan
g/String;)V
   9:   astore_1
   10:  iconst_0
   11:  istore_2
   12:  goto    24
   15:  aload_1
   16:  iload_2
   17:  invokevirtual   #49; //Method java/lang/StringBuffer.append:(I)Ljava/lan
g/StringBuffer;
   20:  pop
   21:  iinc    2, 1
   24:  iload_2
   25:  sipush  10000
   28:  if_icmplt       15
   31:  return

看看多么简单,在循环开始前创建好StringBuffer,然后再循环里面调用append方法(第17:),只创建了一个对象,然后只在缓冲区里面进行字符操作。

2010年7月10日 13:02
0 0

http://www.javaworld.com/javaworld/javatips/jw-javatip92.html

2010年7月10日 07:57
0 0

我记得当时我侧过10w循环的测试
String 和StringBuffer 时间没有任何差别!!
我不知道你是怎么测得啊

2010年7月09日 09:07
0 0

你在看一下,别的帖子说的String连加会不会是
aa="A"+"A"+"A"+"A"+"A"+"A"+"A"+"A"+"A"+"A"+"A"+"A"
而不是
aa += "A";aa += "A";aa += "A";aa += "A";aa += "A";

2010年7月08日 21:05
0 0

拜求,String的连加优越在哪?

2010年7月08日 14:30
0 0

如果官方没有文档的话,
1) 可以咨询这个讨论主题里提出这个观点的人
2) 搜索相关主题

因为在这里, 很难遇到对这个在官方文档都没有提及的问题有深入了解的人

2010年7月08日 14:13
0 0

很明显这位大神在浪费时间。。。

2010年7月08日 13:16
0 0

引用
这个我知道,我想问的是,之前别的帖子上说,JDK5下JVM会将String连加优化为StringBuilder.append()操作,这样的话,上面的测试中,两者的耗时应该是很接近的,但实际却不是这样,不解。

他这么说有给出他的依据么? 这个可以咨询他一下的.
但是据我查看 JDK 5 的 changenote, 是没有提到 String 的这一优化方式的.
http://java.sun.com/j2se/1.5.0/ReleaseNotes.html#intro

2010年7月08日 12:14
0 0

为啥你那么纠结性能?既然你知道StringBuffer 和 String 在处理不同问题上的优点.为啥你还要去关注性能呢?不解!

2010年7月08日 10:49
0 0

粘贴,复制的大神

2010年7月08日 09:21
0 0

在字符串修改操作频繁的情况下, 肯定是 StringBuffer 的性能优于 String 的性能.
StringBuffer 出现的目的就是为了改进 String 的缺点

只不过 StringBuffer 是线程安全的, 它会在线程控制方面额外用力, 如果是单线程环境下频繁操作字符串, 可以使用 StringBuilder

2010年7月07日 23:16
0 0

其实,我更想问的是,为啥之前你不用循环

2010年7月07日 22:00
0 0

没有看到附件,如果直接用String,至少jdk还要帮你重新实例化一下了,用stringbuffer就直接操作了

2010年7月07日 21:32

相关推荐

    StringBuffer和String_区别

    StringBuffer和String_区别 java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的...

    String、StringBuilder和StringBuffer的区别

    String、StringBuilder和StringBuffer的区别 String、StringBuilder和StringBuffer的区别 String、StringBuilder和StringBuffer的区别

    String StringBuffer和StringBuilder区别之源码解析

    String、StringBuffer和StringBuilder的比较 通过上面的分析,我们可以看到,String类的字符串是不可变的,而StringBuffer和StringBuilder类的字符串可以被修改。StringBuffer类是线程安全的,而StringBuilder类...

    String,StringBuffer,StringBuilder区别

    String,StringBuffer,StringBuilder区别。几乎所有的应用开发都离不开操作字符串,理解字符串的设计和实现以及相关 工具如拼接类的使用,对写出高质量代码是非常有帮助的

    String及StringBuffer和StringBuilder的区别

    字符串处理基础知识 String、StringBuffer 和 StringBuilder 是 Java 语言中三种不同类型的字符串处理方式,它们之间存在着明显的性能和线程安全性差异。...选择合适的字符串处理方式取决于具体的应用场景和性能要求。

    String、StringBuffer与StringBuilder之间区别

     StringBuffer:字符创变量  StringBuilder:字符创变量  从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:

    黑马程序员java培训就业班笔记:StringBuffer、基本数据类型的封装)总结JAVA语言

    黑马程序员java培训就业班笔记:StringBuffer、基本数据类型的封装)总结

    stringbuffer和string的区别.pdf

    stringbuffer和string的区别.pdf

    String ,StringBuffer与StringBuilder

    在 Java 中,String, StringBuffer 和 StringBuilder 三个类都是用于字符操作的,但它们之间有着很大的区别。 首先,String 是不可变类,意味着一旦创建了 String 对象,就不能修改它的值。每次对 String 对象的...

    string和StringBuffer的区别

    在Java编程语言中,`String`和`StringBuffer`都是用来表示和操作字符串的重要类,但它们在使用场景和性能上有显著的区别。了解这些差异对于编写高效、优化的代码至关重要。 首先,`String`类是不可变的。这意味着...

    String、StringBuffer、StringBuilder的使用方法

    在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`是处理字符串的三个重要类,它们各自有特定的使用场景和优缺点。理解它们的差异对于编写高效的代码至关重要。 **String类** `String`是不可变的类,...

    源码string和stringbuffer

    针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍...

    string与stringbuffer的区别

    字符串在Java中的表现形式主要有两种:`String`和`StringBuffer`(或者`StringBuilder`)。它们之间的主要区别在于可变性、性能和使用场景。 1. **不可变性**: `String`类是不可变的,这意味着一旦创建了一个`...

    java高级特性StringBuffer类.doc

    StringBuffer 对象和 String 对象之间的互转可以使用 toString() 方法和构造方法,例如:String s = "abc"; StringBuffer sb = new StringBuffer(s); String s1 = sb.toString(); StringBuffer 类中的方法主要偏重...

    String与StringBuffer区别详解

    在Java编程语言中,`String`和`StringBuffer`(在Java 5之后被`StringBuilder`取代,但在多线程环境中仍然使用`StringBuffer`)是处理文本字符串的两个核心类,它们各自有着不同的特性和用途。理解它们的区别对于...

    javaString 和StringBuffer的区别

    JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据.这个String类提供了数值不可改变的字符串.而这个StringBuffer类提供的字符串进行修改.当你知道字符数据要改变的时候...

    String、StringBuilder、StringBuffer 用法比较

    stringbuilder用法 String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String...

    Java String 和StringBuffer的详解及区别

    String 和StringBuffer 的性能比较 在大量字符串拼接的场景下,StringBuffer 的性能远远高于 String。例如: * 使用 String 进行字符串拼接:String str = new String(); for(int i=0;i;i++){ str= str + i;} 这种...

    C++封装过的JSON转换包,功能齐全

    #include "rapidjson/stringbuffer.h"// rapidjson::StringBuffer buf; rapidjson::Writer&lt;rapidjson::StringBuffer&gt; writer(buf); //rapidjson::PrettyWriter&lt;rapidjson::StringBuffer&gt; writer(buf); // it can ...

    String和StringBuffer的区别

    String的效率低于StringBuffer,开发时最好选用StringBuffer。

Global site tag (gtag.js) - Google Analytics