在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);
区别是什么?以及每个人的表现如何?
答案 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
个字符串对象。
"<head>"
"</head>"
"<body>"
"<head></head>"
"<head></head><body>"
这一直持续到你的所有字符串都是concatenated
。
但是在out.print()
的情况下,只创建了3
String对象。
我正在研究JSP,我在JSP中创建了一个Table
。 Don'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;方法