- 浏览: 7960154 次
- 性别:
- 来自: 广州
-
最新评论
-
xiaobadi:
jacky~~~~~~~~~
推荐两个不错的mybatis GUI生成工具 -
masuweng:
(转)JAVA获得机器码的实现 -
albert0707:
有些扩展名为null
java 7中可以判断文件的contenttype了 -
albert0707:
非常感谢!!!!!!!!!
java 7中可以判断文件的contenttype了 -
zhangle:
https://zhuban.me竹板共享 - 高效便捷的文档 ...
一个不错的网络白板工具
评论
s = "http://" + "localhost" + path 是最高的,但是也有时候用法是
s="aaa";
xxx运算
s += str1;
xxx运算
s +=str2;
这样就效率低了。
。。。原文根本没有讨论这种情况吧(前面一直都说是“单行的字符串连加”),我虽然没装Eclipse,但不相信Eclipse能把这种代码自动转为用StringBuilder实现。而它能自动转化的,偏偏是效率等价,易读性反而更差的场景,为啥要提供这样的功能。这才是我不明白的地方。
一个可能的解释就是可能以前版本的JDK编译器不会把单行加号直接生成一个string,后来优化了,但是eclipse没能跟进。
s = "http://" + "localhost" + path 是最高的,但是也有时候用法是
s="aaa";
xxx运算
s += str1;
xxx运算
s +=str2;
这样就效率低了。
。。。原文根本没有讨论这种情况吧(前面一直都说是“单行的字符串连加”),我虽然没装Eclipse,但不相信Eclipse能把这种代码自动转为用StringBuilder实现。而它能自动转化的,偏偏是效率等价,易读性反而更差的场景,为啥要提供这样的功能。这才是我不明白的地方。
好吧,试了下,确实很傻。对于我说的那种场景不能自动转,倒是转了一把无用的单行加号。
编译结果还是
10 ldc <String "str1S"> [26]
12 astore_2 [str]
s = "http://" + "localhost" + path 是最高的,但是也有时候用法是
s="aaa";
xxx运算
s += str1;
xxx运算
s +=str2;
这样就效率低了。
。。。原文根本没有讨论这种情况吧(前面一直都说是“单行的字符串连加”),我虽然没装Eclipse,但不相信Eclipse能把这种代码自动转为用StringBuilder实现。而它能自动转化的,偏偏是效率等价,易读性反而更差的场景,为啥要提供这样的功能。这才是我不明白的地方。
IDEA和ECLIPSE编辑器为什么这么做不清楚,但最终还是应该看编译结果吧。至少连加在eclipse+jdk1.7下编译出来的效率确实不如SB来的高,不知道IDEA下的结果如何。
不过还是那句话,最终项目的编译还是要以部署服务器决定。
对于大部分主流JDK,单行连加编译出来的byte code跟你自己手写new StringBuilder再append再toString是一样的呀,不存在效率差异。只有在循环体内做字符串拼接,然后在循环结束后才引用结果,才会出现StringBuilder优于字符串加法的场景。
而且,如果你不小心把两个字符串常量拆开来拼接,例如
效率要比
高(一点点),因为字符串常量加法在编译期就直接做了,不用在运行期求值,连加编译出来的结果等价于
s = "http://" + "localhost" + path 是最高的,但是也有时候用法是
s="aaa";
xxx运算
s += str1;
xxx运算
s +=str2;
这样就效率低了。
再补充下,其实有些需求可以用String做模板,然后正则或者replace替换。
从执行效率上看,单行连加或StringBuilder是最高的(但连加的代码更易读)。String.format的易读性有时更好,但效率差一点。String.replace和正则适用于复杂场景,但效率最低。
IDEA和ECLIPSE编辑器为什么这么做不清楚,但最终还是应该看编译结果吧。至少连加在eclipse+jdk1.7下编译出来的效率确实不如SB来的高,不知道IDEA下的结果如何。
不过还是那句话,最终项目的编译还是要以部署服务器决定。
对于大部分主流JDK,单行连加编译出来的byte code跟你自己手写new StringBuilder再append再toString是一样的呀,不存在效率差异。只有在循环体内做字符串拼接,然后在循环结束后才引用结果,才会出现StringBuilder优于字符串加法的场景。
而且,如果你不小心把两个字符串常量拆开来拼接,例如
效率要比
高(一点点),因为字符串常量加法在编译期就直接做了,不用在运行期求值,连加编译出来的结果等价于
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替换。
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下的结果如何。
不过还是那句话,最终项目的编译还是要以部署服务器决定。
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移到循环后面的操作。
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。
http://www.blogjava.net/nokiaguy/archive/2008/05/07/198990.html
只要不在循环里,单行的+链接和StringBuilder是等价的。
即使在循环里,如果你把new StringBuilder放在循环内部,同样是等价的。换句话说,如果你把字符串连加表达式放在循环内部,然后用这个功能转换成StringBuilder,还要把new StringBuilder这一行移到循环外部。而你既然会在循环内部写字符串连加表达式,其结果往往是在每次循环内部直接使用的,这样你每次循环还需要清空StringBuilder。
IDEA提供的编译器辅助是把StringBuilder转成+表达式,Eclipse怎么反着来……
http://www.blogjava.net/nokiaguy/archive/2008/05/07/198990.html
完全可以在代码中使用 + 来进行字符串连接, 这样代码的可阅读性更好。