据我所知,当你有大量的String时,使用+符号的结合字符串不是一个好习惯。但是当我检查eclipse生成的toString()方法时(写点击源文件 - > Source - > Generate 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中的bellow或为什么eclipse不考虑它。
public String expectedToString(){
StringBuffer sb = new StringBuffer();
sb.append("Temp [tempName=").append(tempName).append(",").append(" tempValue=").append(tempValue).append("]");
return sb.toString();
}
我将使用自动生成的toString()方法来记录我的对象值。
请建议我。
答案 0 :(得分:8)
无需更改任何内容,它紧凑且易于阅读,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();
答案 1 :(得分:0)
请注意,Eclipse 4.21(2021 年 7 月,9 年后)将有助于生成正确的代码:
<块引用>添加了新的清理功能,将代码转换为使用 StringBuilder
(在 Java 1.5 中添加)而不是 StringBuffer
,后者具有同步方法并且比使用 StringBuilder
慢。>
有一个子选项,其中更改只会发生在默认情况下启用的局部变量。
当此子选项打开时,只会对方法本地的 StringBuffer
变量进行更改。
当一个方法调用具有此类变量的其他方法或向/从字段/参数赋值时,方法内容不会被转换。
允许将 StringBuffer 字段或参数附加到本地 StringBuffer
变量,然后这些变量仍然可以转换为 StringBuilder
。
当该选项被选中并且局部变量的子选项被关闭时,所有被选中文件中StringBuffer
的用法都被更改为StringBuilder
,无论用法如何。
应该注意的是,在这种情况下,清理将不会跟踪引用的非选定类和方法,并且可能需要更改才能成功编译。
要应用清理,请选中清理配置文件中 Use StringBuilder instead of StringBuffer
标签上的 Optimization
复选框。
要仅指定局部变量,请选中下方的 Only for local variables
复选框。
示例:
会变成: