java性能:字符串文字

时间:2013-01-26 09:24:51

标签: java memory-management

我想知道字符串文字和java性能之间的关系。

例如,使用以下语句次数会对性能产生任何影响。我有数千个类,很多时候我们使用以下语句:

1) buffer.append(",");
2) buffer.append("}");

3)String.append("10,000 times...same lines") // printing same lines in many classes
3)String.someStringMethod("same line many times") // using any String method 

这是否会对内存管理等方面造成性能影响。我们有更清洁的方法吗?

由于

2 个答案:

答案 0 :(得分:3)

很难对没有意义的例子发表评论。但是:

  • 一般来说,Java String文字没有特别的效率问题。
  • 通常,将String文字作为参数的方法没有特别的效率问题。
  • 如果特定的代码片段经常执行,则字符串连接/构建可能会引起效率问题。但是,如果你需要构建字符串,那么你可以做很多事情。

有一两件事值得采取措施避免。主要是:

   String s = "";
   for (/* lots of times */) {
       // do stuff
       s += someOtherString;
   }

问题是这会生成并丢弃大量临时字符串。更有效的方法是:

   StringBuilder sb = new StringBuilder();
   for (/* lots of times */) {
       // do stuff
       sb.append(someOtherString);
   }
   String s = sb.toString();

但是,如果探查器告诉您这段代码是瓶颈,那么优化此类事情可能是值得的。

答案 1 :(得分:1)

  1. 您编写的任何代码都会影响性能,因此最好使用“,}”而不是2次附加调用一个append()。

  2. java.lang.String类中没有附加方法。

  3. 没有任何String方法对String对象进行更改。相反,String.substring(),String.concat(),String.replace()等方法会创建新的String对象。这意味着与使用StringBuffer相比,性能受到的影响更大。

  4. 因此,StringBuffer方法通常比String快。但是,最近推出了名为StringBuilder的新类。与StringBuilder只有一个区别 - 它不是线程安全的。在现实世界中,线程管理由更高级别的容器处理,因此不必确保每个类的线程安全。在这些情况下,建议您使用StringBuilder。那应该是最快的。

  5. 为了进一步提高StringBuilder的性能,您必须知道结果字符串长度以分配适当大小的StringBuilder。如果它太大你会浪费一些记忆,但这通常是一个小问题。如果它太小了,StringBuilder将不得不重新创建内部字符数组以为更多字符腾出空间。这会使特定的append()调用变慢。实际上,这不是调用缓慢,而是调用垃圾收集来清理内存。

  6. String类的特定方法可能比StringBuffer / StringBuilder中的方法更好或更快,但是你必须更具体地回答这些问题才能回答这个问题。