String,StringBuilder和StringBuffer的区别(二)

来源:互联网 发布:unity3d前景怎么样 编辑:程序博客网 时间:2024/05/30 12:30
三、String,StringBuilder和StringBuffer的性能测试
附代码:
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class StringTest {
  4. public static String BASEINFO = "Mr.Y";
  5. public static final int COUNT = 2000000;
  6. /**
  7. * 执行一项String赋值测试
  8. */
  9. public static void doStringTest() {
  10. String str = new String(BASEINFO);
  11. long starttime = System.currentTimeMillis();
  12. for (int i = 0; i < COUNT / 100; i++) {
  13. str = str + "miss";
  14. }
  15. long endtime = System.currentTimeMillis();
  16. System.out.println((endtime - starttime)
  17. + " millis has costed when used String.");
  18. }
  19. /**
  20. * 执行一项StringBuffer赋值测试
  21. */
  22. public static void doStringBufferTest() {
  23. StringBuffer sb = new StringBuffer(BASEINFO);
  24. long starttime = System.currentTimeMillis();
  25. for (int i = 0; i < COUNT; i++) {
  26. sb = sb.append("miss");
  27. }
  28. long endtime = System.currentTimeMillis();
  29. System.out.println((endtime - starttime)
  30. + " millis has costed when used StringBuffer.");
  31. }
  32. /**
  33. * 执行一项StringBuilder赋值测试
  34. */
  35. public static void doStringBuilderTest() {
  36. StringBuilder sb = new StringBuilder(BASEINFO);
  37. long starttime = System.currentTimeMillis();
  38. for (int i = 0; i < COUNT; i++) {
  39. sb = sb.append("miss");
  40. }
  41. long endtime = System.currentTimeMillis();
  42. System.out.println((endtime - starttime)
  43. + " millis has costed when used StringBuilder.");
  44. }
  45. /**
  46. * 测试StringBuffer遍历赋值结果
  47. *
  48. * @param mlist
  49. */
  50. public static void doStringBufferListTest(List<String> mlist) {
  51. StringBuffer sb = new StringBuffer();
  52. long starttime = System.currentTimeMillis();
  53. for (String string : mlist) {
  54. sb.append(string);
  55. }
  56. long endtime = System.currentTimeMillis();
  57. System.out.println(sb.toString() + "buffer cost:"
  58. + (endtime - starttime) + " millis");
  59. }
  60. /**
  61. * 测试StringBuilder迭代赋值结果
  62. *
  63. * @param mlist
  64. */
  65. public static void doStringBuilderListTest(List<String> mlist) {
  66. StringBuilder sb = new StringBuilder();
  67. long starttime = System.currentTimeMillis();
  68. for (String string:mlist) {
  69. sb.append(string);
  70. }
  71. long endtime = System.currentTimeMillis();
  72. System.out.println(sb.toString() + "builder cost:"
  73. + (endtime - starttime) + " millis");
  74. }
  75. public static void main(String[] args) {
  76. doStringTest();
  77. doStringBufferTest();
  78. doStringBuilderTest();
  79. List<String> list = new ArrayList<String>();
  80. list.add(" I ");
  81. list.add(" like ");
  82. list.add(" BeiJing ");
  83. list.add(" tian ");
  84. list.add(" an ");
  85. list.add(" men ");
  86. list.add(" . ");
  87. for(int i=0;i<10000;i++){
  88. list.add(String.valueOf(i));
  89. }
  90. doStringBufferListTest(list);
  91. doStringBuilderListTest(list);
  92. }
  93. }
输出:

从上面的结果可以看出,不考虑多线程,采用String对象时(我把Count/100),执行时间比其他两个都要高,而采用StringBuffer对象和采用StringBuilder对象的差别也比较明显。由此可见,如果我们的程序是在单线程下运行,或者是不必考虑到线程同步问题,我们应该优先使用StringBuilder类;如果要保证线程安全,自然是StringBuffer

后面List的测试结果可以看出,除了对多线程的支持不一样外,这两个类的使用方式和结果几乎没有任何差别。

0 0
原创粉丝点击