java性能:字符串文本

java性能:字符串文本,java,memory-management,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") // usi

我想知道字符串文字和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 
这是否会对内存管理等方面的性能造成影响。我们有没有更干净的方法


谢谢

很难对毫无意义的例子进行评论。然而:

  • 一般来说,Java字符串文本没有特别的效率问题
  • 一般来说,采用字符串文字作为参数的方法没有特别的效率问题
  • 如果某段代码执行得足够频繁,字符串连接/构建可能会带来效率问题。然而,如果您需要构建字符串,那么就没有什么可以做的了
有一两件事值得采取措施避免。主要的一点是:

   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();

然而,只有当探查器告诉您这段特定的代码是一个瓶颈时,才有可能对这类事情进行优化。

很难对毫无意义的示例进行评论。然而:

  • 一般来说,Java字符串文本没有特别的效率问题
  • 一般来说,采用字符串文字作为参数的方法没有特别的效率问题
  • 如果某段代码执行得足够频繁,字符串连接/构建可能会带来效率问题。然而,如果您需要构建字符串,那么就没有什么可以做的了
有一两件事值得采取措施避免。主要的一点是:

   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();
然而,只有当探查器告诉您这段特定的代码是一个瓶颈时,才有可能对这类事情进行优化

  • 您编写的任何代码都会影响性能,因此最好使用“,}”调用一个append(),而不是两个append

  • java.lang.String类中没有方法append

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

  • 因此,通常StringBuffer方法比String方法更快。然而,最近引入了一个名为StringBuilder的新类。与StringBuilder只有一个区别——它不是线程安全的。在现实世界中,线程管理由更高级别的容器负责,因此没有必要确保每个类的线程安全。在这些情况下,建议您使用StringBuilder。那应该是最快的

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

  • String类的特定方法可能比StringBuffer/StringBuilder中的方法更好或更快,但您必须更具体地回答我的问题才能回答这个问题

  • 您编写的任何代码都会影响性能,因此最好使用“,}”调用一个append(),而不是两个append

  • java.lang.String类中没有方法append

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

  • 因此,通常StringBuffer方法比String方法更快。然而,最近引入了一个名为StringBuilder的新类。与StringBuilder只有一个区别——它不是线程安全的。在现实世界中,线程管理由更高级别的容器负责,因此没有必要确保每个类的线程安全。在这些情况下,建议您使用StringBuilder。那应该是最快的

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

  • String类的特定方法可能比StringBuffer/StringBuilder中的方法更好或更快,但您必须更具体地回答我的问题才能回答这个问题


  • 这(大部分)是无效的Java代码,因此很难对其效率进行评论。@Stephen:是的,这是无效的。我只是想举个例子……我的观点是,对一个毫无意义的例子进行评论是没有用的。请提供有意义的示例,说明您希望我们评论的代码类型。(你的更新没有帮助…)使用内存分析器并确定是否有问题。@Stephen:我明白。让我试着澄清一下。我有1000个类,其中我们使用了这样的类型