Java中的System.out.println()和\n有什么区别?

8

假设我想要打印5行文字,哪种方法最好(考虑性能和可读性)。

System.out.println();
System.out.println();
System.out.println();
System.out.println();
System.out.println();

或者
System.out.println("\n\n\n\n");

这是一种偏好问题还是其中一种更好?使用第二种方法似乎可以节省很多时间。


@pst -- 如果可以的话,我会给你的评论点赞加2的 :-) - Kal
我严重怀疑在性能方面有任何差异,并且可读性是个人选择(并且取决于情况)。 - Riaan Cornelius
5
我记得当我刚开始学习计算机科学时,我几乎想到了同样的问题。作为一名学生,很难知道真正的计算机科学家会做什么。我记得感觉"\n"看起来很奇怪,总是更喜欢多打几个printlns。对于一个刚开始学习计算机科学的人来说,这不是一个琐碎的问题。(@pst仍然+1,但我认为你应该解释一下原因:这是一个非常有趣的问题!) - Ziggy
8个回答

31

两者之间存在功能差异。第一种版本使用平台首选换行符输出换行。第二个版本输出换行字符,这可能不适合在Windows或Mac OS上使用。

这比任何实际或想象中的性能优势都更重要。


关于性能问题,以及为什么每个人似乎都在说“够了”。

你写这段代码的两种方式之间的性能差异可能只有微秒或更少。换句话说,除非代码执行数百万次,否则终端用户不会注意到差异。

通常,专业软件工程师认为,如果不需要使某些东西变得更快,那么花时间使其更快就不值得。而且用客户的钱来做这件事肯定不值得。

只有在有明确的证据表明存在性能问题并且你将要优化的代码才是真正的问题所在/将要出现的情况下,才应该进行微小优化。 如果将时间花费在错误的代码部分进行优化,则时间将被浪费。

那么如何知道何时优化?

  • 当应用程序根据实际重要标准测量时变得可观察地缓慢时。

那么如何知道要优化什么

  • 通过运行应用程序分析器,并分析其输出以查看实际性能热点和瓶颈在哪里。

性能并不总是一个不重要的问题。 实际上,对于某些类型的软件,不考虑性能和可扩展性要求的设计或实现可能是一场灾难。 但大多数软件都不是这样的。


1
虽然你提出的所有观点都是正确和有价值的,但从一开始就学会编写高效的代码意味着以后需要优化的需求更少。 - MikeHall
1
@MikeHall - 也许吧。但对于大多数人来说,“第一次编写高性能代码”意味着花费更长时间思考和编写他们的代码的第一个版本。(更不用说在错误的信念下浪费时间询问这样的问题…认为这会有任何区别。)当然,有些例外程序员很容易编写高性能的代码。但是他们是例外的…如果他们真诚地承认,他们甚至会承认这并不像看起来那么容易。 - Stephen C

9
也许比两者都更好的是:
System.out.printf("%n%n%n%n%n");

这将使用适合您平台的换行符,而"\n"则不会。


这比4个调用println()更简洁,但如果考虑解码格式字符串的开销,可能会更慢。另一方面,这*可能不重要!!!*所以这是一个很好的替代方案。 - Stephen C

0

对于平台相关的换行符,我会使用:

String ls = System.getProperty("line.separator");
System.out.print(ls+ls+ls+ls+ls);

这应该可以在Windows、Linux或Mac上运行。


0
第二个代码显然更简洁,从性能上来看可能不会有太大差别,但后者可能会更快,因为它只需要一次调用,不过这种差别可以忽略不计。

0

从答案中可以看出,这是一个偏好的问题。你提供的例子非常简单,性能提升和可读性问题都很小。然而,在一些更复杂的情况下,选择使用看似等效的方法可能会对你的代码造成严重影响,或者使它难以被邻居理解。

如果代码看起来有点混乱,请尝试将混乱的代码抽象出来,并给它一个易于阅读的方法名。

所以,是的,这是一个偏好的问题。

(编辑:不,显然这不是一个偏好的问题(^o^ )//)


2
这不仅是个人喜好。正如Stephen C所指出的,存在功能上的差异 - Paul Cager
嗯...如果用户真的在询问println,并且只是一个喜欢了解他最喜欢的函数的println粉丝,那么是的,这就是答案。然而,我认为用户想知道程序员是更喜欢重复自己还是简洁明了。这只是一个巧合,在这种情况下存在功能上的区别(或者也许这里的教训是,通过足够的研究,任何被认为是偏好的事情都可以归结为功能选择?)。 - Ziggy

-1

第二个选项是更好的方法。

这不仅对程序员来说更容易,而且会减少函数开销。


4
我们仍在争论函数开销吗?热点优化器将以内联或优化的方式处理大多数内容,因此,除非我们在循环中调用一个方法数百万次,否则性能损失可以忽略不计... - Riaan Cornelius
是的,我忘了提到在这个例子中性能损失是不存在的。 - ssell
2
+1 但是听我说,你想打赌原帖作者并不知道那个有趣的话题吗?为什么不发表一个回答来表达这个观点呢? - Ziggy

-1
第二个选项几乎肯定更快,因为每次调用println()都会导致调用系统函数。这种跳转到内核代码需要一定的时间。这就是在C中进行缓冲的原因。

-1

以下程序的输出结果是什么?

System.out.println("\ /");

如果输出结果是 /,那么为什么它不是输出 \ / 呢?


1
欢迎来到StackOverflow!这个答案并没有为问题提供解决方案,因此建议您自己提出问题https://stackoverflow.com/questions/ask,以便写出问题和目标是什么,附上感兴趣的代码部分,并解释您尝试解决问题的方法。 - xKobalt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接