new StringBuffer("a"+"b"+"c"+"e"+"f"+"g").append("hijklmn")
上面的代码我都有点迷惑,不知道作者怎么想的,应该说他也听说过StringBuffer的好处的我们项目中就有人这么写的,我测过
public static void main(String args[]) throws Exception {
String s="abcdefghijklmnopqrstuvwxyz";
String b=s;
long start = System.currentTimeMillis();
for(int i=0;i<1000;i++) {
b+=s;
}
System.out.println("用 String 耗时:"+(System.currentTimeMillis()-start));
s="abcdefghijklmnopqrstuvwxyz";
StringBuffer sb = new StringBuffer("abcdefghijklmnopqrstuvwxyz");
start = System.currentTimeMillis();
for(int i=0;i<1000;i++) {
sb.append(s);
sb.toString();
}
System.out.println("用 StringBuffer 耗时:"+(System.currentTimeMillis()-start));
}下面是几组执行结果:
1。
用 String 耗时:19124
用 StringBuffer 耗时:37192。
用 String 耗时:20109
用 StringBuffer 耗时:49213。
用 String 耗时:15562
用 StringBuffer 耗时:33444。
用 String 耗时:19109
用 StringBuffer 耗时:58435。
用 String 耗时:18453
用 StringBuffer 耗时:5016如果先测试StringBuffer,代码如下
public static void main(String args[]) throws Exception {
String s="abcdefghijklmnopqrstuvwxyz";
String b=s;
StringBuffer sb = new StringBuffer("abcdefghijklmnopqrstuvwxyz");
long start = System.currentTimeMillis();
for(int i=0;i<1000;i++) {
sb.append(s);
sb.toString();
}
System.out.println("用 StringBuffer 耗时:"+(System.currentTimeMillis()-start));
s="abcdefghijklmnopqrstuvwxyz";
start = System.currentTimeMillis();
for(int i=0;i<1000;i++) {
b+=s;
}
System.out.println("用 String 耗时:"+(System.currentTimeMillis()-start));
}那么测试出来的几组结果为:1。
用 StringBuffer 耗时:5203
用 String 耗时:179372。
用 StringBuffer 耗时:4515
用 String 耗时:174533。
用 StringBuffer 耗时:3984
用 String 耗时:148754。
用 StringBuffer 耗时:4609
用 String 耗时:184225。
用 StringBuffer 耗时:4235
用 String 耗时:17109上面的数据是在我的机器系统资源十分紧缺的情况下测出来的,所以数字都比较的大
但怎么都不会影响数据的比较,及说明问题
它们最终都是生成一样的字符串
特别是有些人在处理复杂SQL语句的时候经常有字符串的连接
用StringBuffer比String++快多了
上面的代码我都有点迷惑,不知道作者怎么想的,应该说他也听说过StringBuffer的好处的我们项目中就有人这么写的,我测过
public static void main(String args[]) throws Exception {
String s="abcdefghijklmnopqrstuvwxyz";
String b=s;
long start = System.currentTimeMillis();
for(int i=0;i<1000;i++) {
b+=s;
}
System.out.println("用 String 耗时:"+(System.currentTimeMillis()-start));
s="abcdefghijklmnopqrstuvwxyz";
StringBuffer sb = new StringBuffer("abcdefghijklmnopqrstuvwxyz");
start = System.currentTimeMillis();
for(int i=0;i<1000;i++) {
sb.append(s);
sb.toString();
}
System.out.println("用 StringBuffer 耗时:"+(System.currentTimeMillis()-start));
}下面是几组执行结果:
1。
用 String 耗时:19124
用 StringBuffer 耗时:37192。
用 String 耗时:20109
用 StringBuffer 耗时:49213。
用 String 耗时:15562
用 StringBuffer 耗时:33444。
用 String 耗时:19109
用 StringBuffer 耗时:58435。
用 String 耗时:18453
用 StringBuffer 耗时:5016如果先测试StringBuffer,代码如下
public static void main(String args[]) throws Exception {
String s="abcdefghijklmnopqrstuvwxyz";
String b=s;
StringBuffer sb = new StringBuffer("abcdefghijklmnopqrstuvwxyz");
long start = System.currentTimeMillis();
for(int i=0;i<1000;i++) {
sb.append(s);
sb.toString();
}
System.out.println("用 StringBuffer 耗时:"+(System.currentTimeMillis()-start));
s="abcdefghijklmnopqrstuvwxyz";
start = System.currentTimeMillis();
for(int i=0;i<1000;i++) {
b+=s;
}
System.out.println("用 String 耗时:"+(System.currentTimeMillis()-start));
}那么测试出来的几组结果为:1。
用 StringBuffer 耗时:5203
用 String 耗时:179372。
用 StringBuffer 耗时:4515
用 String 耗时:174533。
用 StringBuffer 耗时:3984
用 String 耗时:148754。
用 StringBuffer 耗时:4609
用 String 耗时:184225。
用 StringBuffer 耗时:4235
用 String 耗时:17109上面的数据是在我的机器系统资源十分紧缺的情况下测出来的,所以数字都比较的大
但怎么都不会影响数据的比较,及说明问题
它们最终都是生成一样的字符串
特别是有些人在处理复杂SQL语句的时候经常有字符串的连接
用StringBuffer比String++快多了
写这代码的的人对StringBuffer的发明者是一种侮辱!
new StringBuffer("a"+"b"+"c"+"e"+"f"+"g").append("hijklmn");
其生成的字节码与
new StringBuffer("abcdefg").append("hijklmn");
是一样的StringBuffer中参数如果是全常量字符串相加会在java编译器编译时会优化成一个字符串我想要说明的是,有人在代码中写成了下面的样子
new StringBuffer("a"+this.sql+"b"+"c"+"e"+"f"+"g").append("hijklmn");
中间加了一个变量就大了一样了
new StringBuffer("a"+this.sql+"b"+"c"+"e"+"f"+"g").append("hijklmn");
其执行效果与下是一样的
new StringBuffer("a").append("b")..append(this.sql)..append("c")..append("d").append("e").append("f").append("g").append("hijklmn")矫正一下,从代码执行上来说是不会有问题的java最怕的是在外面的字符串加字符串
而对于长度一直递增的或者是迭加次数比较多的时候就要用StringBuffer了
有时候你乍一看不一定知道别人为什么这样做,我劝搂主不要早下定论。
这个似乎不牵扯到什么定论不定论,这样写出的代码,我都当它是laji
java.lang
Class StringBuilder
java.lang.Object
java.lang.StringBuilderAll Implemented Interfaces:
Serializable, Appendable, CharSequence 而且用jdk1.5编译器来编译如下代码
String a="a";
a+=a;
就会借助于StringBuilder来处理 0: ldc #17; //String a
2: astore_1
3: new #19; //class StringBuilder
6: dup
7: aload_1
8: invokestatic #25; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
11: invokespecial #28; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
14: aload_1
15: invokevirtual #32; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
18: invokevirtual #36; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
21: astore_1楼上的,能不能帮忙解释一下,StringBuilder与StringBuffer比有什么好处当初我也是查看用jdk1.5编译器编译出来的class才发现jdk1.5下多出了一个StringBuilder
但到现在还不是很明白它的优越性,一直也没有细究下去