A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 乔兵 高级黑马   /  2013-10-7 07:29  /  2327 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

(转)以前一直有人说,foreach的性能有损失,不建议使用,今天特意测试了一下,结果是 for方式的性能最好,foreach次之,而Iterator循环性能最差..

1 完整的测试代码
  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. import java.util.List;
  4. /**
  5. * 测试JAVA各种循环的性能。<br>
  6. * for 方式的性能最好,foreach次之,而Iterator循环性能最差。
  7. *
  8. * @author 老紫竹研究室(laozizhu.com)
  9. */
  10. public class TestLoop {
  11. public static void main(String[] args) {
  12. int number = 1000000;
  13. // 我们构造一个列表
  14. List<String> list = new ArrayList<String>(number);
  15. for (int i = 0; i < number; i++) {
  16. list.add(Integer.toString(i));
  17. }
  18. System.out.println("测试列表的性能...");
  19. // 我们用foreach方式测试
  20. long begin = System.nanoTime();
  21. for (String i : list) {
  22. testMethod(i);
  23. }
  24. System.out.printf("%10s=%10d\n", "foreach", System.nanoTime() - begin);
  25. begin = System.nanoTime();
  26. // 下面我们用Iterator测试
  27. Iterator<String> it = list.iterator();
  28. while (it.hasNext()) {
  29. testMethod(it.next());
  30. }
  31. System.out.printf("%10s=%10d\n", "iterator", (System.nanoTime() - begin));

  32. // 第三种,我们用index进行
  33. begin = System.nanoTime();
  34. for (int i = 0; i < number; i++) {
  35. testMethod(list.get(i));
  36. }
  37. System.out.printf("%10s=%10d\n", "for", (System.nanoTime() - begin));
  38. System.out.println("测试数组的性能...");
  39. // 我们再来测试数组
  40. String[] strArr = new String[number];
  41. for (int i = 0; i < number; i++) {
  42. strArr[i] = Integer.toString(i);
  43. }
  44. // 我们用foreach方式测试
  45. begin = System.nanoTime();
  46. for (String i : strArr) {
  47. testMethod(i);
  48. }
  49. System.out.printf("%10s=%10d\n", "foreach", System.nanoTime() - begin);
  50. // 第二种,我们用index进行
  51. begin = System.nanoTime();
  52. for (int i = 0; i < number; i++) {
  53. testMethod(strArr[i]);
  54. }
  55. System.out.printf("%10s=%10d\n", "for", System.nanoTime() - begin);
  56. }
  57. public static void testMethod(String str) {
  58. }
  59. }

  60. import java.util.ArrayList;
  61. import java.util.Iterator;
  62. import java.util.List;
  63. /**
  64. * 测试JAVA各种循环的性能。<br>
  65. * for 方式的性能最好,foreach次之,而Iterator循环性能最差。
  66. *
  67. * @author 老紫竹研究室(laozizhu.com)
  68. */
  69. public class TestLoop {
  70. public static void main(String[] args) {
  71. int number = 1000000;
  72. // 我们构造一个列表
  73. List<String> list = new ArrayList<String>(number);
  74. for (int i = 0; i < number; i++) {
  75. list.add(Integer.toString(i));
  76. }
  77. System.out.println("测试列表的性能...");
  78. // 我们用foreach方式测试
  79. long begin = System.nanoTime();
  80. for (String i : list) {
  81. testMethod(i);
  82. }
  83. System.out.printf("%10s=%10d\n", "foreach", System.nanoTime() - begin);
  84. begin = System.nanoTime();
  85. // 下面我们用Iterator测试
  86. Iterator<String> it = list.iterator();
  87. while (it.hasNext()) {
  88. testMethod(it.next());
  89. }
  90. System.out.printf("%10s=%10d\n", "iterator", (System.nanoTime() - begin));

  91. // 第三种,我们用index进行
  92. begin = System.nanoTime();
  93. for (int i = 0; i < number; i++) {
  94. testMethod(list.get(i));
  95. }
  96. System.out.printf("%10s=%10d\n", "for", (System.nanoTime() - begin));
  97. System.out.println("测试数组的性能...");
  98. // 我们再来测试数组
  99. String[] strArr = new String[number];
  100. for (int i = 0; i < number; i++) {
  101. strArr[i] = Integer.toString(i);
  102. }
  103. // 我们用foreach方式测试
  104. begin = System.nanoTime();
  105. for (String i : strArr) {
  106. testMethod(i);
  107. }
  108. System.out.printf("%10s=%10d\n", "foreach", System.nanoTime() - begin);
  109. // 第二种,我们用index进行
  110. begin = System.nanoTime();
  111. for (int i = 0; i < number; i++) {
  112. testMethod(strArr[i]);
  113. }
  114. System.out.printf("%10s=%10d\n", "for", System.nanoTime() - begin);
  115. }
  116. public static void testMethod(String str) {
  117. }
  118. }
复制代码
2 运行结果

测试列表的性能...
foreach= 41997864
iterator= 43951774
for= 14351289
测试数组的性能...
foreach= 1751863
for= 1484585

3 结论:

foreach的性能很一般,for才是最好的,推荐大家使用。

评分

参与人数 1技术分 +1 收起 理由
夜默 + 1

查看全部评分

2 个回复

倒序浏览
顶!!!!!!!!!!!!!!!!!
回复 使用道具 举报
吴光新 来自手机 黑马帝 2013-10-7 10:47:07
藤椅
我觉得高级for比一般for的效率低
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马