两种程序写法的区别

terry_yip 2006-02-27 01:04:52
ArrayList lst=new ArrayList();
lst.add("A");
lst.add("B");
lst.add("C");

Iterator it=lst.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}

for(int i=0;i<lst.size();i++)
{
System.out.println(lst.get(i));
}


上面的程序中,用while跟用for的写法,出来的结果是一样的,但我很想知道两者有什么区别,我个人设想可能有效率上的问题,大家来说说。


...全文
455 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanjiawei2005 2006-02-28
  • 打赏
  • 举报
回复
对于list,还是用 Iterator it=lst.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
这个好
universe01 2006-02-27
  • 打赏
  • 举报
回复
ChDw(米)
有道理!
zorro09 2006-02-27
  • 打赏
  • 举报
回复
这样可以看到get(35)是一个非常浪费时间的操作,而Iterator则不同,它是指向在第34个对象再向移动的,可以非常快速

怎么定位到第34个对象呢?
yuzl32 2006-02-27
  • 打赏
  • 举报
回复
虽然是正确的,但是楼上也不要凭感觉啊,看源代码便知. : )
terry_yip 2006-02-27
  • 打赏
  • 举报
回复
星星们都出来了,呵。我个人同意ChDw(米)的说法,我觉得其实Iterator就是给那些没有索引的集合类用的,用于加快这些类型的查找定位,你看为什么ResultSet不用Iterator来循环呢,道理就是这样的。

Hamber 2006-02-27
  • 打赏
  • 举报
回复
明显第一种走的路比较多!
yuzl32 2006-02-27
  • 打赏
  • 举报
回复
文档上也有写到:

As a rule of thumb, a List implementation should implement RandomAccess interface if, for typical instances of the class, this loop:

for (int i=0, n=list.size(); i < n; i++)
list.get(i);

runs faster than this loop:

for (Iterator i=list.iterator(); i.hasNext(); )
i.next();

路过,赶紧工作了..,LZ 保重.
Dan1980 2006-02-27
  • 打赏
  • 举报
回复
建议楼主学学JAVA数据结构
yuzl32 2006-02-27
  • 打赏
  • 举报
回复
to horseyet(horseyet)
一般没有实现RondomAccess的List,get(int i)方法采取的是搜索查找 i,相反的,则直接返回内部存储的一维数组对象(即:return elementData[i])
treeroot 2006-02-27
  • 打赏
  • 举报
回复
根据索引当然是随机访问了

使用碟带迭代器就是遍历呀!
ChDw 2006-02-27
  • 打赏
  • 举报
回复
对于LinkedList来说,它没有实现RondomAccess,因为它内部使用链表存储数据

即,如果它已经存放了100个对象,当需要获得第35个的时候,它需要从第一个开始逐个向后查找,直到第35个为止(若大于50,LinkedList会从后面开始向前找)。

这样可以看到get(35)是一个非常浪费时间的操作,而Iterator则不同,它是指向在第34个对象再向移动的,可以非常快速


所以
对于ArrayList来说第二种性能会好一些,减少了不必要的检查
对于LinkedList来说,第二种是一个非常浪费时间的操作,第一种好一些。
andyli0418 2006-02-27
  • 打赏
  • 举报
回复
晕!!
horseyet 2006-02-27
  • 打赏
  • 举报
回复
不理解lst.get(i)为什么是随机访问方法?
yuzl32 2006-02-27
  • 打赏
  • 举报
回复
看next 的实现方法,我觉得第二种更好一些,因为它也是要通过get方法来获得的

public Object next() {
checkForComodification();
try {
Object next = get(cursor);
lastRet = cursor++;
return next;
} catch(IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
believefym 2006-02-27
  • 打赏
  • 举报
回复
对于没有实现RondomAccess的List最好不要使用get这样的随机访问方法

这句有点不解啊
believefym 2006-02-27
  • 打赏
  • 举报
回复
对于没有实现RondomAccess的List最好不要使用get这样的随机访问方法

这句有点不解啊
treeroot 2006-02-27
  • 打赏
  • 举报
回复
对于没有实现RondomAccess的List最好不要使用get这样的随机访问方法
ChDw 2006-02-27
  • 打赏
  • 举报
回复
对于ArrayList来说第二种性能会好一些,减少了不必要的检查
对于LinkedList来说,第二种是一个非常浪费时间的操作,第一种好一些。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧