什么是多次调用PrintWritter print()或添加字符串然后只打印一次?哪个更好?

时间:2014-12-30 00:23:50

标签: java string performance

在servlet中,通常人们输出如下内容。

PrintWriter out = response.getWriter();
out.print("<html>");
out.print("<head>");
out.print("</head>");
out.print("<body>");
...Many lines here...
out.print("</body>");
out.print("</html>");

写入不同的行,因为如果需要,将来阅读和修改会更方便,但我认为代码就像下一个有效(常见)?

PrintWriter out = response.getWriter();
String outView = "<html>"
  + "<head>"
  + "</head>"
  + "<body>"
  ...Many lines here...
  + "</body>"
  + "</html>";
out.print(outView);

区别是什么?以及每个人的表现如何?

3 个答案:

答案 0 :(得分:2)

这个问题让我想起了这篇关于微优化的博文:The sad tragedy of micro-optimization

基本上,它归结为这样一种观念,即您不应该担心像这样的微小优化差异,但总是选择具有最佳可读性的选项。从长远来看,这将带来最大的利润,因为它将增加代码的可管理性。它将更容易维护,重用和增强。

从这个角度来看:你提到的两种方法都非常糟糕,因为它们涉及直接从servlet打印html。这使得html难以阅读和调试。你应该将html保存在单独的文件中,或者使用某种模板机制,如jsp或jsf。

答案 1 :(得分:1)

在JSP中形成我自己的个人经验。我知道out.print()concatenating strings好。

您可能在文件BufferedOutputStream中使用了IO。如果您将数据写入文件(which actually gets written in a BUFFER),并且只要您认为数据应该是永久性的,那么请致电flush()。并且您的数据将写入文件。好几次我都被困惑了,为什么我的文件是空的。然后在最后我发现,我没有打电话给flush()

out.print()的工作方式相同。 out将数据写入缓冲区,有几个functions来控制其行为。所以每次调用out.print()时,它都会将字符串添加到缓冲区。与String concatentation相比,这很快。

当我们连接字符串时,由于字符串为immutable,因此会创建新的字符串。 所以对于这个

"<head>" + "</head>" + "<body>"

创建了总5个字符串对象。

  1. "<head>"
  2. "</head>"
  3. "<body>"
  4. "<head></head>"
  5. "<head></head><body>"
  6. 这一直持续到你的所有字符串都是concatenated

    但是在out.print()的情况下,只创建了3 String对象。

    我正在研究JSP,我在JSP中创建了一个TableDon't blame me , not my fault, this is the way they work here :)

    我用StringBuffer替换了String添加,它使JSP更快。之前我认为它很慢,因为它正在访问数据并同时创建表,这就是为什么它很慢,但问题是String addition。所以从我的经验来看,总是去out.print()

    如果在编写输出之前确实需要创建输出。使用StringBuffer并在写入响应时使用toString()将其转换回String。这将节省大量时间。

    字符串连接可以多次提供清晰的图片,在开发时使用它,但是对于生产使用StringBuffer。它会更快,取决于你在代码中进行连接的数量。

答案 2 :(得分:0)

据我所知,JVM中有一些称为字符串池的东西。这意味着所有字符串1."<head>" 2. "</head>" 3. "<body>"等都存储在那里。这意味着如果你有像

这样的东西
String v1="head";
String v2="head";

v1&amp; v2将引用同一个对象。如果没有对它们的引用,这些对象有资格进行垃圾收集。现在我认为(我从来没有尝试过)的问题是你的&#34; outView&#34;变得如此之大,以至于它不适合在字符串池中,你会得到一个超出范围的例外...其中&#34; response.getWriter&#34;返回一个具有内部缓冲的对象,它使用堆空间进行内部缓冲,因此最好使用&#34; response.getWriter&#34;方法