首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中hasnext()在集合中是如何工作的

在java中hasnext()在集合中是如何工作的
EN

Stack Overflow用户
提问于 2010-09-03 20:00:48
回答 3查看 79.8K关注 0票数 4

程序:

代码语言:javascript
复制
public class SortedSet1 {

  public static void main(String[] args) {  

    List ac= new ArrayList();

    c.add(ac);
    ac.add(0,"hai");
    ac.add(1,"hw");
    ac.add(2,"ai"); 
    ac.add(3,"hi"); 
    ac.add("hai");

    Collections.sort(ac);

    Iterator it=ac.iterator();

    k=0;

    while(it.hasNext()) {    
      System.out.println(""+ac.get(k));
      k++;     
    }
  }
}

输出: ai hai hi hw hai

它如何执行5次??而到了海边,没有下一个元素出现,所以条件不正确。但它是如何执行的。

EN

回答 3

Stack Overflow用户

发布于 2010-09-03 20:02:53

上面的循环使用索引遍历列表。在it到达列表末尾之前,it.hasNext()将返回true。因为您没有在循环中调用it.next()来推进迭代器,所以it.hasNext()会一直返回true,然后循环就会继续运行。直到k变为5,这时会抛出一个IndexOutOfBoundsException,它会退出循环。

使用迭代器的正确用法是

代码语言:javascript
复制
while(it.hasNext()){
    System.out.println(it.next());
}

或使用索引

代码语言:javascript
复制
for(int k=0; k<ac.size(); k++) {
  System.out.println(ac.get(k));
}

但是,由于Java5,首选方法是使用foreach循环(和泛型):

代码语言:javascript
复制
List<String> ac= new ArrayList<String>();
...
for(String elem : ac){
    System.out.println(elem);
}
票数 16
EN

Stack Overflow用户

发布于 2010-09-03 20:04:42

关键是与it.next()相反,ac.get(k)不消耗迭代器的任何元素。

票数 2
EN

Stack Overflow用户

发布于 2010-09-03 20:32:41

那个循环永远不会结束。it.hasNext不推进迭代器。您必须调用it.next()来推进它。循环可能会终止,因为k变为5,此时数组抛出边界异常。

迭代列表(包含字符串)的正确形式是:

代码语言:javascript
复制
Iterator it = ac.iterator();
while (it.hasNext) {
  System.out.println((String) it.next());
}

或者如果列表是键入的,例如ArrayList

代码语言:javascript
复制
for (String s : ac) {
  System.out.println((String) s);
}

或者,如果你绝对知道这是一个数组列表,并且需要比简洁更快的速度:

代码语言:javascript
复制
for (int i = 0; i < ac.size(); i++) {
  System.out.println(ac.get(i));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3635474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档