我正在开发一个性能增强项目。我有一个疑问,当我们在一个过程中,我们倾向于追踪DTO和所用实体的当前状态。因此,为此,我们在所有POJO中都包含了toString()方法。我现在以三种不同的方式实现了toString(): -
public String toString() {
return "POJO :" + this.class.getName() + " RollNo :" + this.rollNo + " Name :" + this.name;
}
public String toString() {
StringBuffer buff = new StringBuffer("POJO :").append(this.class.getName()).append(" RollNo :").append(this.rollNo).append(" Name :").append(this.name);
return buff.toString();
}
public String toString() {
StringBuilder builder = new StringBuilder("POJO :").append(this.class.getName()).append(" RollNo :").append(this.rollNo).append(" Name :").append(this.name);
return builder .toString();
}
任何人都可以帮助我找出哪一个是最好的,并且应该用于提高性能。
答案 0 :(得分:13)
在这种情况下,+
的人很好。它更具可读性,与StringBuilder/StringBuffer
版本相比,性能更高,因为它不会在循环中发生。
如果您在循环中构建String
,那么您应该使用StringBuilder
。如果您需要StringBuffer
功能,则只能使用synchronized
,这种情况并不经常发生。
简单地说(总是不正确,但这是一个很好的经验法则),除非你用+=
做String
,否则你真的不需要StringBuilder/StringBuffer
String.format
选项通常不考虑的一个选项是使用String.format
。它看起来像这样:
return String.format("POJO : %s RollNo %s : Name : %s",
this.getClass().getName(),
this.rollNo,
this.name
);
我发现这是最具可读性和可维护性的版本。
这更快吗?可能是可能不是。对于类似toString()
的常见用例场景,通常无关紧要。力求可读性,只有在分析表明有必要时才进行优化。
我已将原始代码中的语法错误从this.class
(无法编译)更正为this.getClass()
。
答案 1 :(得分:9)
使用第一个,因为它更具可读性。
但除此之外,没关系。
在这种情况下使用StringBuilder
和+
是等效的,因为编译器会将重载的+
运算符转换为StringBuilder
。
StringBuffer
由于其方法为synchronized
而速度较慢,但由于编译器可能会使用escape analysis(更具体地说,同步省略)(在较新版本中) ),它会自动删除synchronized
关键字。 (参见JDK 6u14 release notes了解逃逸分析)
答案 2 :(得分:3)
使用第一个。我会解释原因。
天真的观点是使用最后一个。没有理由使用第二个。 StringBuffer
与StringBuilder
相同,但它会从synchronized
锁定中受到性能影响。但是不要把它放在一条线上。这更具可读性:
public String toString() {
StringBuilder out = new StringBuilder(("POJO :");
out.append(this.getClass().getName());
out.append(" RollNo :");
out.append(this.rollNo);
out.append(" Name :");
out.append(this.name);
return out.toString();
}
话虽如此,你必须要小心这种微优化。为什么?因为编译器经常会为你做这件事。因此,编写最易读的内容,让编译器对其进行优化。
所以这里的主要教训是:不进行微观优化。
但最终,使用1或3中的哪一个可能无关紧要。 toString()
方法不会倾向于在应用程序中大量使用。更常见的是,它们被用在错误消息中,这些消息很少见。
答案 3 :(得分:2)
这是更易读的IMO
public String toString() {
return String.Format("POJO : {0} RollNo : {1} Name : {2}",
this.getClass().getName(),
this.rollNo,
this.name);
}