免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 18809 | 回复: 17
打印 上一主题 下一主题

JAVA遍历LIst的性能 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-26 11:29 |只看该作者 |倒序浏览
有以下两种方法遍历:
     
  1. public void list1(List<String> list)
  2.         {
  3.                 long l1 = System.currentTimeMillis();
  4.                 for (String string : list)
  5.                 {
  6.                         System.out.println(string);
  7.                 }
  8.                 System.out.println(System.currentTimeMillis() - l1);
  9.         }

  10.         public void list2(List<String> list)
  11.         {
  12.                 long l1 = System.currentTimeMillis();
  13.                 Iterator<String> it = list.iterator();
  14.                 while (it.hasNext())
  15.                 {
  16.                         String str = it.next();
  17.                         System.out.println(str);
  18.                 }
  19.                 System.out.println(System.currentTimeMillis() - l1);
  20.         }
复制代码


推荐使用第二种方式,性能比第一种快。
奥秘在于应用程序自身不维护遍历集合的"指针",所有的内部状态(如当前元素位置,是否有下一个元素)都由Iterator来维护,而这个Iterator由集合类通过工厂方法生成,因此,它知道如何遍历整个集合。  应用程序不直接和集合类打交道,它总是控制Iterator,向它发送"向前","向后","取当前元素"的命令,就可以间接遍历整个集合。

[ 本帖最后由 starxing 于 2008-8-26 17:42 编辑 ]

评分

参与人数 1可用积分 +1 收起 理由
sakulagi + 1 原创内容

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2008-08-26 16:55 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2008-08-26 17:42 |只看该作者
原帖由 javavsnet 于 2008-8-26 16:55 发表
写的好!
客户端这个词有点怪,改为应用程序是否好点?

见错就该

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2008-08-26 21:13 |只看该作者
原帖由 starxing 于 2008-8-26 11:29 发表
有以下两种方法遍历:
      public void list1(List list)
        {
                long l1 = System.currentTimeMillis();
                for (String string : list)
                {
                        System.out.println(string);
                }
                System.out.println ... 推荐使用第二种方式,性能比第一种快。
奥秘在于应用程序自身不维护遍历集合的"指针",所有的内部状态(如当前元素位置,是否有下一个元素)都由Iterator来维护,而这个Iterator由集合类通过工厂方法生成,因此,它知道如何遍历整个集合。  应用程序不直接和集合类打交道,它总是控制Iterator,向它发送"向前","向后","取当前元素"的命令,就可以间接遍历整个集合。
为什么说第二种方式快啊?怎样的程序证明的?

for (String string : list)这种语法是要求list位置是一个容器,当然数组也可以,我想内部就是用的Iterator吧。不然人家怎么遍历的啊?

论坛徽章:
0
5 [报告]
发表于 2008-08-26 23:30 |只看该作者
我也有同样的疑问,请楼主指教。

论坛徽章:
0
6 [报告]
发表于 2008-08-27 09:09 |只看该作者
你可以找个大List执行以下两个方法就可以测试出来

论坛徽章:
0
7 [报告]
发表于 2008-08-27 09:41 |只看该作者
记得好像看语法介绍时说for(:)这种语法遍历List的时候内部就是用Iterator的,包装了一下
慢也就是应该的。但确实减少学习难度了,代码可读性也更好。初学者很容易陷入迭代这个词中去的

论坛徽章:
0
8 [报告]
发表于 2008-08-27 10:08 |只看该作者
给个测试程序和结果吧,比较怀疑这个结论

论坛徽章:
0
9 [报告]
发表于 2008-08-27 10:09 |只看该作者
写错了第一种遍历方法是这个


  1. public void list1(List<String> list)
  2.         {
  3.                 long l1 = System.currentTimeMillis();
  4.                 for (int i=0;i<list.size();i++)
  5.                 {
  6.                         String string = list.get(i);
  7.                         System.out.println(string);
  8.                 }
  9.                 System.out.println(System.currentTimeMillis() - l1);
  10.         }
复制代码

这个慢

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
10 [报告]
发表于 2008-08-27 20:54 |只看该作者
原帖由 starxing 于 2008-8-27 10:09 发表
写错了第一种遍历方法是这个


public void list1(List list)
        {
                long l1 = System.currentTimeMillis();
                for (int i=0;i

List是一个ArrayList还是LinkedList就不一定是这个慢了。。。LinkedList当然是慢了,每次得从头找呢。ArrayList可能还更快呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP