我的一位教授曾说过,以下代码永远不应该完成:
的System.out.println(object.toString());
他说(我相信引用“有效的Java”)会导致双重调用。由于print语句调用对象的toString方法,因此将toString方法调用两次效率较低。首选方法是使用:
的System.out.println(对象);
显然,这种方式在代码中看起来更好,可以节省时间。无论怎样,我都会这样做,但我的问题是“这实际上更有效吗?”。在查看PrintStream文档时,print方法已被重载以将String作为参数(如果首先调用toString方法,则会出现这种情况)。我没有看到该版本的print方法调用输入参数的toString方法,我不相信它会这样做有意义。
另外,对不起,如果这是重复的话。我找不到任何主题。
答案 0 :(得分:9)
您的示例在PrintStream中调用两种不同的方法。两者最多只调用一次toString()
。
但是,使用System.out.println(object)
有潜在的优势。如果 object 为null,则打印“null”。另一个语句抛出NullPointerException。
答案 1 :(得分:6)
不,它效率不高 - 正是因为你提到的过载。此外,toString
对String
的调用非常快,因此即使没有过载,差异也无法衡量。
然而,你的教授是不是像System.out.println(object.toString());
那样打电话,但原因是不同的:因为电话是不必要的,你的代码的读者可能会感到困惑。
答案 2 :(得分:0)
在多线程环境中调用System.out.println实际上已经足够糟糕了,甚至比不必要的toString调用要糟糕得多。存在“问题”是因为你在“println”中有一个同步调用:
public void println() {
newLine();
}
private void newLine() {
try {
synchronized (this) {
ensureOpen();
...
}
因此,如果您正在尝试编写高效的java,那么您可以从避免它开始。作为替代方案,您可以使用任何不同的日志记录机制,例如http://www.slf4j.org/