`

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  
编译器优化已经帮你做了转换了。 可以反编译看看代码。

完全可以在代码中使用 + 来进行字符串连接, 这样代码的可阅读性更好。

相关推荐

    StringBuilder的用法

    2. 设置容量和长度:可以使用重载的构造函数之一来指定 StringBuilder 类的容量,例如 StringBuilder MyStringBuilder = new StringBuilder("Hello World!", 25);。也可以使用读/写 Capacity 属性来设置对象的最大...

    java中stringBuilder的用法.pdf

    当需要频繁修改字符串时(如在循环中拼接字符串),使用StringBuilder相比于使用String的concat方法或者加号操作符,可以减少创建新的String对象,从而降低内存消耗,提高程序运行效率。 知识点概述: 1. ...

    StringBuilders.jl:Julia的StringBuilder类型

    某些人可能会发现更易于使用更高级别的StringBuilders.jl API。 为了进行比较,上面使用IOBuffer的示例为 io = IOBuffer () write (io, " First string " ) write (io, " Second String " ) s = String ( take! (io...

    C#源代码-使用StringBuilder来拼接HTML中的Table表格.zip

    StringBuilder类在C#中用于字符串操作,特别是在需要频繁进行字符串拼接的情况下,它比使用"+"或String.Concat()方法更高效。 在C#中,当使用"+"或String.Concat()来拼接大量字符串时,每次操作都会创建新的字符串...

    C#中StringBuilder类的使用方法

    C#中StringBuilder类的使用方法 C#中的StringBuilder类是 System.Text 命名空间下的一个类,用于高效地处理和操作字符串。StringBuilder类的出现是为了解决String类的不可变性问题,每次使用String类中的方法时,都...

    StringBuilder的用法.docx

    StringBuilder 类在 Java 中被广泛用于字符串的构建和操作,尤其在需要频繁进行字符串拼接时,StringBuilder 提供了显著的性能优势。相比 String 类,它不是不可变的,这意味着我们可以在一个 StringBuilder 实例上...

    Sql Into StringBuilder

    2. **性能优化**:使用`StringBuilder`比使用字符串连接更高效,因为字符串在.NET中是不可变的,每次连接都会创建一个新的字符串对象。而`StringBuilder`则是在内存中的一个可变缓冲区,减少了垃圾回收的压力。 3. ...

    java StringBuilder详解

    本篇文章将深入解析`StringBuilder`的使用方法、内部机制以及与`StringBuffer`的区别。 `StringBuilder`是Java中的一个类,它位于`java.lang`包下,主要负责动态构建和修改字符串。与`String`不同,`String`对象是...

    String、StringBuffer、StringBuilder的使用方法

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

    07 StringBuilder

    因此,在单线程环境下使用`StringBuilder`通常比使用`StringBuffer`更快,因为后者为多线程环境添加了额外的开销。 #### 二、主要特点 1. **可变性**:`StringBuilder`对象允许在其上执行各种修改操作,如添加、...

    winform 使用StringBuilder源码

    总结起来,"winform 使用StringBuilder源码"是一个探讨如何在Windows Forms应用中利用StringBuilder进行字符串操作的资源,通过学习和实践这些示例,开发者可以更好地理解和运用StringBuilder,提升WinForm应用的...

    String和StringBuilder类的区别

    - **StringBuilder**:与之不同的是,`StringBuilder` 类是可变的(mutable)。这意味着可以对 `StringBuilder` 对象进行多次修改(如添加、删除或替换字符),而不会创建新的对象。这使得 `StringBuilder` 在需要...

    sql语句转 StringBuilder buffer

    - 压缩包中的`FY辅助工具`可能是一个实用的小工具,它可能是用来帮助程序员快速转换SQL语句到`StringBuilder`格式的。这种工具可以自动化处理字符串拼接,减少手动操作,提高开发效率。 - 使用此类工具时,我们...

    StringBuilder类

    1. `append()`:这是StringBuilder的核心方法之一,用于将指定的内容追加到现有的字符串生成器末尾。它有多个重载版本,可以接受各种类型的参数,如字符串、整型、浮点型、布尔值甚至其他对象。例如,`sb.append(...

    String StringBuffer和StringBuilder区别之源码解析

    "String StringBuffer和StringBuilder区别之源码解析" 在Java中,字符串是我们经常使用的数据类型,而String、StringBuffer和StringBuilder是Java中三种常用的字符串类。在这篇文章中,我们将从源码角度对String、...

    stringBuilder完整版.pdf

    可以使用重载的构造函数之一来指定 StringBuilder 类的容量。以下代码示例指定可以将 MyStringBuilder 对象扩充到最大 25 个空白。 MyStringBuilder.Capacity = 25; EnsureCapacity 方法可用来检查当前 ...

    sql语句转为java的StringBuilder

    先在navicat之类的工具格式化sql!!!!! sql语句写完之后转为美观的java,在sql语句很长了之后有点麻烦。 其实代码逻辑简单,但是有一点就是有时候没时间来写,所以附上源代码和可执行的jar文件

    javascript-classes-inheritance:IntBuilder和StringBuilder类

    然后创建2个子类(从基础继承):ES6样式的IntBuilder和ES5样式的StringBuilder。几乎所有方法都应可链接以方便使用。您可以向类添加任何自己的方法和属性!下面介绍的方法必须在您的解决方案中 ES6类IntBuilder: ...

Global site tag (gtag.js) - Google Analytics