`

eclipse小tips之:快速使用stringbuilder

 
阅读更多
  stringbuilder比直接用 “+”的好处在哪,就不多说了;但如果之前用了+号的话,如果
要改成用stringbuilder的话,则可以用如下的方法实现:

比如有:
String foo = "This" + "is" + "Sparta";

1 鼠标点住要变为stringbuilder的 字符串,这里就是点foo了,然后按“CTRL+1(数字1)”
2 然后在弹出的菜单中选择““StringBuilder” for string concatenation”

3 按回车键确认,则变为:
StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("This");
        stringBuilder.append("is");
        stringBuilder.append("Sparta");
String foo = stringBuilder.toString();
    

3
2
分享到:
评论
15 楼 jackyrong 2014-02-09  
不错,大家讨论得很热烈
14 楼 kanme818 2014-01-30  
kidneyball 写道
kanme818 写道

s = "http://" + "localhost" + path 是最高的,但是也有时候用法是
s="aaa";
xxx运算
s += str1;
xxx运算
s +=str2;

这样就效率低了。


。。。原文根本没有讨论这种情况吧(前面一直都说是“单行的字符串连加”),我虽然没装Eclipse,但不相信Eclipse能把这种代码自动转为用StringBuilder实现。而它能自动转化的,偏偏是效率等价,易读性反而更差的场景,为啥要提供这样的功能。这才是我不明白的地方。


一个可能的解释就是可能以前版本的JDK编译器不会把单行加号直接生成一个string,后来优化了,但是eclipse没能跟进。
13 楼 kanme818 2014-01-30  
kidneyball 写道
kanme818 写道

s = "http://" + "localhost" + path 是最高的,但是也有时候用法是
s="aaa";
xxx运算
s += str1;
xxx运算
s +=str2;

这样就效率低了。


。。。原文根本没有讨论这种情况吧(前面一直都说是“单行的字符串连加”),我虽然没装Eclipse,但不相信Eclipse能把这种代码自动转为用StringBuilder实现。而它能自动转化的,偏偏是效率等价,易读性反而更差的场景,为啥要提供这样的功能。这才是我不明白的地方。


好吧,试了下,确实很傻。对于我说的那种场景不能自动转,倒是转了一把无用的单行加号。
编译结果还是
10  ldc <String "str1S"> [26]
12  astore_2 [str]
12 楼 kidneyball 2014-01-30  
kanme818 写道

s = "http://" + "localhost" + path 是最高的,但是也有时候用法是
s="aaa";
xxx运算
s += str1;
xxx运算
s +=str2;

这样就效率低了。


。。。原文根本没有讨论这种情况吧(前面一直都说是“单行的字符串连加”),我虽然没装Eclipse,但不相信Eclipse能把这种代码自动转为用StringBuilder实现。而它能自动转化的,偏偏是效率等价,易读性反而更差的场景,为啥要提供这样的功能。这才是我不明白的地方。
11 楼 kanme818 2014-01-30  
kidneyball 写道
kanme818 写道

IDEA和ECLIPSE编辑器为什么这么做不清楚,但最终还是应该看编译结果吧。至少连加在eclipse+jdk1.7下编译出来的效率确实不如SB来的高,不知道IDEA下的结果如何。
不过还是那句话,最终项目的编译还是要以部署服务器决定。


对于大部分主流JDK,单行连加编译出来的byte code跟你自己手写new StringBuilder再append再toString是一样的呀,不存在效率差异。只有在循环体内做字符串拼接,然后在循环结束后才引用结果,才会出现StringBuilder优于字符串加法的场景。

而且,如果你不小心把两个字符串常量拆开来拼接,例如
s = "http://" + "localhost" + path

效率要比
s = new StringBuilder()
   .append("http://")
   .append("localhost")
   .append(path).toString()

高(一点点),因为字符串常量加法在编译期就直接做了,不用在运行期求值,连加编译出来的结果等价于
s = new StringBuilder()
   .append("http://localhost")
   .append(path).toString()


s = "http://" + "localhost" + path 是最高的,但是也有时候用法是
s="aaa";
xxx运算
s += str1;
xxx运算
s +=str2;

这样就效率低了。
10 楼 kidneyball 2014-01-30  
kanme818 写道

再补充下,其实有些需求可以用String做模板,然后正则或者replace替换。


从执行效率上看,单行连加或StringBuilder是最高的(但连加的代码更易读)。String.format的易读性有时更好,但效率差一点。String.replace和正则适用于复杂场景,但效率最低。
9 楼 kidneyball 2014-01-30  
kanme818 写道

IDEA和ECLIPSE编辑器为什么这么做不清楚,但最终还是应该看编译结果吧。至少连加在eclipse+jdk1.7下编译出来的效率确实不如SB来的高,不知道IDEA下的结果如何。
不过还是那句话,最终项目的编译还是要以部署服务器决定。


对于大部分主流JDK,单行连加编译出来的byte code跟你自己手写new StringBuilder再append再toString是一样的呀,不存在效率差异。只有在循环体内做字符串拼接,然后在循环结束后才引用结果,才会出现StringBuilder优于字符串加法的场景。

而且,如果你不小心把两个字符串常量拆开来拼接,例如
s = "http://" + "localhost" + path

效率要比
s = new StringBuilder()
   .append("http://")
   .append("localhost")
   .append(path).toString()

高(一点点),因为字符串常量加法在编译期就直接做了,不用在运行期求值,连加编译出来的结果等价于
s = new StringBuilder()
   .append("http://localhost")
   .append(path).toString()
8 楼 kanme818 2014-01-30  
kidneyball 写道
kanme818 写道
kidneyball 写道
yuechen323 写道
看看这篇文章你就知道了,别听1L
http://www.blogjava.net/nokiaguy/archive/2008/05/07/198990.html


只要不在循环里,单行的+链接和StringBuilder是等价的。

即使在循环里,如果你把new StringBuilder放在循环内部,同样是等价的。换句话说,如果你把字符串连加表达式放在循环内部,然后用这个功能转换成StringBuilder,还要把new StringBuilder这一行移到循环外部。而你既然会在循环内部写字符串连加表达式,其结果往往是在每次循环内部直接使用的,这样你每次循环还需要清空StringBuilder。

IDEA提供的编译器辅助是把StringBuilder转成+表达式,Eclipse怎么反着来……


不应该依赖于某个IDE的编译器的结果,看了一楼的回复特地去试了下eclipse+1.7编译器,加好拼接事实上还是会临时创建一个StringBuilder然后把String拼上去再转回String。


是的,所以我说是“等价”的。但是从易读性和代码量来看连加的写法要比先new个StringBuffer再一堆append再toString回去要好。

上面写“IDEA编译器辅助”是手误,其实是“IDEA编辑器辅助”。在IDEA里,如果你new了个StringBuilder然后立马一堆append,再立刻toString。编辑器会提示这里可以改成连加,你在提示的代码上按alt-enter就可以选择一键改为等价的连加。奇怪的是Eclipse提供这个把连加改为StringBuilder有什么实际意义。如果你有循环结构的话,写代码时就会在先new一个StringBuilder再写循环,很少会出现你在循环内部写了连加,然后一键转成StringBuilder,然后再把new语句移到循环之前,把toString移到循环后面的操作。

再补充下,其实有些需求可以用String做模板,然后正则或者replace替换。
7 楼 kanme818 2014-01-30  
kidneyball 写道
kanme818 写道
kidneyball 写道
yuechen323 写道
看看这篇文章你就知道了,别听1L
http://www.blogjava.net/nokiaguy/archive/2008/05/07/198990.html


只要不在循环里,单行的+链接和StringBuilder是等价的。

即使在循环里,如果你把new StringBuilder放在循环内部,同样是等价的。换句话说,如果你把字符串连加表达式放在循环内部,然后用这个功能转换成StringBuilder,还要把new StringBuilder这一行移到循环外部。而你既然会在循环内部写字符串连加表达式,其结果往往是在每次循环内部直接使用的,这样你每次循环还需要清空StringBuilder。

IDEA提供的编译器辅助是把StringBuilder转成+表达式,Eclipse怎么反着来……


不应该依赖于某个IDE的编译器的结果,看了一楼的回复特地去试了下eclipse+1.7编译器,加好拼接事实上还是会临时创建一个StringBuilder然后把String拼上去再转回String。


是的,所以我说是“等价”的。但是从易读性和代码量来看连加的写法要比先new个StringBuffer再一堆append再toString回去要好。

上面写“IDEA编译器辅助”是手误,其实是“IDEA编辑器辅助”。在IDEA里,如果你new了个StringBuilder然后立马一堆append,再立刻toString。编辑器会提示这里可以改成连加,你在提示的代码上按alt-enter就可以选择一键改为等价的连加。奇怪的是Eclipse提供这个把连加改为StringBuilder有什么实际意义。如果你有循环结构的话,写代码时就会在先new一个StringBuilder再写循环,很少会出现你在循环内部写了连加,然后一键转成StringBuilder,然后再把new语句移到循环之前,把toString移到循环后面的操作。


IDEA和ECLIPSE编辑器为什么这么做不清楚,但最终还是应该看编译结果吧。至少连加在eclipse+jdk1.7下编译出来的效率确实不如SB来的高,不知道IDEA下的结果如何。
不过还是那句话,最终项目的编译还是要以部署服务器决定。
6 楼 kidneyball 2014-01-30  
kanme818 写道
kidneyball 写道
yuechen323 写道
看看这篇文章你就知道了,别听1L
http://www.blogjava.net/nokiaguy/archive/2008/05/07/198990.html


只要不在循环里,单行的+链接和StringBuilder是等价的。

即使在循环里,如果你把new StringBuilder放在循环内部,同样是等价的。换句话说,如果你把字符串连加表达式放在循环内部,然后用这个功能转换成StringBuilder,还要把new StringBuilder这一行移到循环外部。而你既然会在循环内部写字符串连加表达式,其结果往往是在每次循环内部直接使用的,这样你每次循环还需要清空StringBuilder。

IDEA提供的编译器辅助是把StringBuilder转成+表达式,Eclipse怎么反着来……


不应该依赖于某个IDE的编译器的结果,看了一楼的回复特地去试了下eclipse+1.7编译器,加好拼接事实上还是会临时创建一个StringBuilder然后把String拼上去再转回String。


是的,所以我说是“等价”的。但是从易读性和代码量来看连加的写法要比先new个StringBuffer再一堆append再toString回去要好。

上面写“IDEA编译器辅助”是手误,其实是“IDEA编辑器辅助”。在IDEA里,如果你new了个StringBuilder然后立马一堆append,再立刻toString。编辑器会提示这里可以改成连加,你在提示的代码上按alt-enter就可以选择一键改为等价的连加。奇怪的是Eclipse提供这个把连加改为StringBuilder有什么实际意义。如果你有循环结构的话,写代码时就会在先new一个StringBuilder再写循环,很少会出现你在循环内部写了连加,然后一键转成StringBuilder,然后再把new语句移到循环之前,把toString移到循环后面的操作。
5 楼 kanme818 2014-01-30  
kidneyball 写道
yuechen323 写道
看看这篇文章你就知道了,别听1L
http://www.blogjava.net/nokiaguy/archive/2008/05/07/198990.html


只要不在循环里,单行的+链接和StringBuilder是等价的。

即使在循环里,如果你把new StringBuilder放在循环内部,同样是等价的。换句话说,如果你把字符串连加表达式放在循环内部,然后用这个功能转换成StringBuilder,还要把new StringBuilder这一行移到循环外部。而你既然会在循环内部写字符串连加表达式,其结果往往是在每次循环内部直接使用的,这样你每次循环还需要清空StringBuilder。

IDEA提供的编译器辅助是把StringBuilder转成+表达式,Eclipse怎么反着来……


不应该依赖于某个IDE的编译器的结果,看了一楼的回复特地去试了下eclipse+1.7编译器,加好拼接事实上还是会临时创建一个StringBuilder然后把String拼上去再转回String。
4 楼 kidneyball 2014-01-30  
yuechen323 写道
看看这篇文章你就知道了,别听1L
http://www.blogjava.net/nokiaguy/archive/2008/05/07/198990.html


只要不在循环里,单行的+链接和StringBuilder是等价的。

即使在循环里,如果你把new StringBuilder放在循环内部,同样是等价的。换句话说,如果你把字符串连加表达式放在循环内部,然后用这个功能转换成StringBuilder,还要把new StringBuilder这一行移到循环外部。而你既然会在循环内部写字符串连加表达式,其结果往往是在每次循环内部直接使用的,这样你每次循环还需要清空StringBuilder。

IDEA提供的编译器辅助是把StringBuilder转成+表达式,Eclipse怎么反着来……
3 楼 yuechen323 2014-01-29  
看看这篇文章你就知道了,别听1L
http://www.blogjava.net/nokiaguy/archive/2008/05/07/198990.html
2 楼 einstein618 2014-01-29  
得根据具体情况吧
1 楼 joe9i0 2014-01-29  
编译器优化已经帮你做了转换了。 可以反编译看看代码。

完全可以在代码中使用 + 来进行字符串连接, 这样代码的可阅读性更好。
Global site tag (gtag.js) - Google Analytics