哪个toString()方法可以使用性能明智?

时间:2010-06-16 05:51:24

标签: java performance

我正在开发一个性能增强项目。我有一个疑问,当我们在一个过程中,我们倾向于追踪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();
    }

任何人都可以帮助我找出哪一个是最好的,并且应该用于提高性能。

4 个答案:

答案 0 :(得分:13)

在这种情况下,+的人很好。它更具可读性,与StringBuilder/StringBuffer版本相比,性能更高,因为它不会在循环中发生。

如果您在循环中构建String,那么您应该使用StringBuilder。如果您需要StringBuffer功能,则只能使用synchronized,这种情况并不经常发生。

简单地说(总是不正确,但这是一个很好的经验法则),除非你用+=String,否则你真的不需要StringBuilder/StringBuffer

相关问题


A String.format选项

通常不考虑的一个选项是使用String.format。它看起来像这样:

return String.format("POJO : %s RollNo %s : Name : %s",
   this.getClass().getName(),
   this.rollNo,
   this.name
);

我发现这是最具可读性和可维护性的版本。

这更快吗?可能是可能不是。对于类似toString()的常见用例场景,通常无关紧要。力求可读性,只有在分析表明有必要时才进行优化。

API链接


On Class Literals

我已将原始代码中的语法错误从this.class(无法编译)更正为this.getClass()

另见

相关问题

答案 1 :(得分:9)

使用第一个,因为它更具可读性。

但除此之外,没关系。

  • 在这种情况下使用StringBuilder+是等效的,因为编译器会将重载的+运算符转换为StringBuilder

  • StringBuffer由于其方法为synchronized而速度较慢,但​​由于编译器可能会使用escape analysis(更具体地说,同步省略)(在较新版本中) ),它会自动删除synchronized关键字。 (参见JDK 6u14 release notes了解逃逸分析)

答案 2 :(得分:3)

使用第一个。我会解释原因。

天真的观点是使用最后一个。没有理由使用第二个。 StringBufferStringBuilder相同,但它会从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);
}