【问题标题】:Eclipse autogenerated toString() methodEclipse 自动生成的 toString() 方法
【发布时间】:2012-12-30 04:54:12
【问题描述】:

据我所知,当您有大量字符串时,使用 + 号连接字符串不是一个好习惯。但是当我检查 eclipse 生成的 toString() 方法时(点击源文件 -> 源 -> 生成 toString() )它具有相同的。

public class Temp
 {
      private String tempName;
      private String tempValue;

      // here getters and setters

  /* (non-Javadoc)
         * @see java.lang.Object#toString()
  */
@Override
public String toString() {
    return "Temp [tempName=" + tempName + ", tempValue=" + tempValue + "]";
}

}

是否有任何地方可以像我预期的 toString() 方法一样在 Eclipse 中进行配置,或者为什么 Eclipse 不考虑这一点。

   public String expectedToString(){
    StringBuffer sb = new StringBuffer();
    sb.append("Temp [tempName=").append(tempName).append(",").append(" tempValue=").append(tempValue).append("]");
    return sb.toString();
}

我将使用自动生成的 toString() 方法来记录我的对象值。

请给我建议。

【问题讨论】:

  • IIRC 1) 现在最好的方法是使用 StringBuilder 和 2) 现在编译器将 String + 更改为 StringBuilder 表达式。有人可以确认吗?
  • 使用 + 连接不再是问题。编译器优化了 + 的使用,尤其是在涉及多个字符串时。
  • 非问题:"+" 和 ".append()" 和 ".concat()" 在这种情况下应该执行相同的操作。有趣的链接:vogella.com/blog/2009/07/19/java-string-performancYet again on string append vs concat vs +

标签: java eclipse tostring


【解决方案1】:

不需要改变任何东西,它紧凑且易于阅读,javac 将使用 StringBuilder 进行实际连接,如果你反编译你的 Temp.class 你会看到

public String toString() {
   return (new StringBuilder("Temp [tempName=")).append(tempName).append(", tempValue=").append(tempValue).append("]").toString();
}

但在其他情况下,例如

    String[] a = { "1", "2", "3" };
    String str = "";
    for (String s : a) {
        str += s; 
    }

++= 是真正的性能杀手,请参阅反编译代码

String str = "";
for(int i = 0; i < j; i++) {
    String s = args1[i];
    str = (new StringBuilder(String.valueOf(str))).append(s).toString();
}

在每次迭代中,都会创建一个新的 StringBuilder,然后将其转换为 String。在这里你应该明确地使用 StringBuilder

    StringBuilder sb = new StringBuilder();
    for (String s : a) {
        sb.append(s); 
    }
    String str = sb.toString();

【讨论】:

    【解决方案2】:

    请注意,Eclipse 4.21(2021 年 7 月,9 年后)将有助于生成正确的代码:

    "Use StringBuilder instead of StringBuffer" clean up

    已添加新的清理功能,可将代码转换为使用 StringBuilder(在 Java 1.5 中添加)而不是 StringBuffer,后者具有同步方法并且比使用 StringBuilder 慢。

    有一个子选项,其中更改只会发生在默认情况下启用的局部变量。
    启用此子选项后,只会对方法本地的 StringBuffer 变量进行更改。
    当一个方法调用带有此类变量的其他方法或分配给/从字段/参数时,方法内容将不会被转换。
    允许将 StringBuffer 字段或参数附加到本地 StringBuffer 变量,然后仍然可以转换为 StringBuilder

    选择该选项并关闭本地变量的子选项时,无论用法如何,所选文件中的StringBuffer的所有使用情况都会更改为StringBuilder 需要注意的是,在这种情况下,清理不会追踪到引用的未选择的类和方法,并且可能需要更改才能成功编译。

    要应用清理,请选中清理配置文件中 Optimization 选项卡上的 Use StringBuilder instead of StringBuffer 复选框。
    要仅指定局部变量,请选中下方的 Only for local variables 复选框。

    例子:

    会变成:

    【讨论】:

      猜你喜欢
      • 2011-02-08
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      相关资源
      最近更新 更多