坏的使用非常大的字符串? (JAVA)

前端之家收集整理的这篇文章主要介绍了坏的使用非常大的字符串? (JAVA)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
是否有任何负面的创造巨大的字符串?例如,如果我们从一个潜在的巨大的文本文件中读取文本:
  1. while (scanner.hasNext()) {
  2. someString += scanner.next();
  3. }
  4. // do something cool with someString

将逐行处理文件(一般)更好的解决方案,为什么?

谢谢

解决方法

流媒体vs不

当您可以流式传输时,您可以处理任何大小的文件(假设您真的可以忘记所有已经看到的数据).你最终会有一个自然的O(n)复杂性,这是一件非常好的事情.你不会因为内存不足而中断.

流式可爱…但在每种情况下都不起作用.

StringBuilder的

似乎对StringBuilder建议有一定的争议,这里是显示效果的基准.我不得不减小基准的大小,以便在合理的时间内慢速版本甚至完成.

结果先,然后代码.这是一个非常粗糙和准备的基准,但结果足够戏剧性,使得点…

  1. c:\Users\Jon\Test>java Test slow
  2. Building a string of length 120000 without StringBuilder took 21763ms
  3.  
  4. c:\Users\Jon\Test>java Test fast
  5. Building a string of length 120000 with StringBuilder took 7ms

代码

  1. class FakeScanner
  2. {
  3. private int linesLeft;
  4. private final String line;
  5.  
  6. public FakeScanner(String line,int count)
  7. {
  8. linesLeft = count;
  9. this.line = line;
  10. }
  11.  
  12. public boolean hasNext()
  13. {
  14. return linesLeft > 0;
  15. }
  16.  
  17. public String next()
  18. {
  19. linesLeft--;
  20. return line;
  21. }
  22. }
  23.  
  24. public class Test
  25. {
  26. public static void main(String[] args)
  27. {
  28. FakeScanner scanner = new FakeScanner("test",30000);
  29.  
  30. boolean useStringBuilder = "fast".equals(args[0]);
  31.  
  32. // Accurate enough for this test
  33. long start = System.currentTimeMillis();
  34.  
  35. String someString;
  36. if (useStringBuilder)
  37. {
  38. StringBuilder builder = new StringBuilder();
  39. while (scanner.hasNext())
  40. {
  41. builder.append(scanner.next());
  42. }
  43. someString = builder.toString();
  44. }
  45. else
  46. {
  47. someString = "";
  48. while (scanner.hasNext())
  49. {
  50. someString += scanner.next();
  51. }
  52. }
  53. long end = System.currentTimeMillis();
  54.  
  55. System.out.println("Building a string of length "
  56. + someString.length()
  57. + (useStringBuilder ? " with" : " without")
  58. + " StringBuilder took " + (end - start) + "ms");
  59. }
  60. }

猜你在找的Java相关文章