黑马程序员技术交流社区

标题: 问个关于循环语句性能的问题 [打印本页]

作者: waylent    时间: 2015-4-5 22:40
标题: 问个关于循环语句性能的问题
第一段代码:
  1.                 Collection col1=new ArrayList();
  2.                 for (int i = 0; i < 10000; i++) {
  3.                         col1.add("测试数据"+i);
  4.                 }
  5.                 long startTime=System.currentTimeMillis();
  6.                 Iterator it=col1.iterator();
  7.                 while(it.hasNext()){
  8.                         System.out.println(it.next());
  9.                 }
  10.                 System.out.println(System.currentTimeMillis()-startTime);
复制代码

第二段代码:
  1.                 Collection col1=new ArrayList();
  2.                 for (int i = 0; i < 10000; i++) {
  3.                         col1.add("测试数据"+i);
  4.                 }
  5.                 long startTime=System.currentTimeMillis();
  6.                 for (Iterator it=col1.iterator();it.hasNext();) {
  7.                         System.out.println(it.next());
  8.                 }
  9.                 System.out.println(System.currentTimeMillis()-startTime);
复制代码

为什么第二段代码比第一段代码跑的快?
作者: fantacyleo    时间: 2015-4-5 22:46
目测两段代码没有什么性能差异。楼主测过几次,差距多大,做统计分析了吗?快慢不是那么简单就能得出结论的。
作者: 东东西西    时间: 2015-4-5 23:06
看不懂,,还得努力学习
作者: waylent    时间: 2015-4-5 23:26
fantacyleo 发表于 2015-4-5 22:46
目测两段代码没有什么性能差异。楼主测过几次,差距多大,做统计分析了吗?快慢不是那么简单就能得出结论的 ...

优化测试代码如下:
  1. public static void main(String[] args) {
  2.                 demo3();
  3.                 demo4();
  4.         }
  5.         public static void demo3(){
  6.                 Collection col1=new ArrayList();
  7.         for (int i = 0; i < 1000000; i++) {
  8.                 col1.add("测试数据"+i);
  9.         }
  10.         long startTime=System.currentTimeMillis();
  11.         Iterator it=col1.iterator();
  12.         while(it.hasNext()){
  13.                 System.out.print("");
  14.                 it.next();
  15.         }
  16.         System.out.println(System.currentTimeMillis()-startTime);
  17.         }
  18.         public static void demo4(){
  19.                 Collection col1=new ArrayList();
  20.         for (int i = 0; i < 1000000; i++) {
  21.                 col1.add("测试数据"+i);
  22.         }
  23.         long startTime=System.currentTimeMillis();
  24.         for (Iterator it=col1.iterator();it.hasNext();) {
  25.                    System.out.print("");
  26.                 it.next();
  27.         }
  28.         System.out.println(System.currentTimeMillis()-startTime);
  29.         }
复制代码
运行结果:
12 3 4 5 6 7 8 9 10
demo3 125 111 111 110 117 110 126 110 126 111
demo4 94 95 94 93 101 94 115 100 112 94




作者: waylent    时间: 2015-4-5 23:29
fantacyleo 发表于 2015-4-5 22:46
目测两段代码没有什么性能差异。楼主测过几次,差距多大,做统计分析了吗?快慢不是那么简单就能得出结论的 ...

之所以好奇是因为毕向东基础视频里讲了这两种方式,毕老师说第二种快,就想验证一下,果然如此,但是解释不了
作者: fantacyleo    时间: 2015-4-6 00:22
waylent 发表于 2015-4-5 23:29
之所以好奇是因为毕向东基础视频里讲了这两种方式,毕老师说第二种快,就想验证一下,果然如此,但是解释 ...

我把demo4()和demo3()对调,结果就变成了demo3快。
作者: Dark县令    时间: 2015-4-6 00:37
个人认为没有什么差别,只是for里面的变量时存在栈内存里面相对而言要节约空间而已!
作者: l落落落叶    时间: 2015-4-6 08:48
还好还好。。。。
作者: 王烽棋    时间: 2015-4-6 18:09
Dark县令 发表于 2015-4-6 00:37
个人认为没有什么差别,只是for里面的变量时存在栈内存里面相对而言要节约空间而已! ...

Dark县令所言极是
作者: 赵振邦    时间: 2015-4-6 18:37
完全看不懂啊     。。。。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2