how hasnext() works in collection in java

做~自己de王妃 提交于 2020-01-22 12:46:06

问题


program:

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++;     
    }
  }
}

output: ai hai hi hw hai

how it execute 5 times?? while come to hai no next element present so condition false. But how it executed.


回答1:


Your loop above iterates through the list using an index. it.hasNext() returns true until it reaches the end of the list. Since you don't call it.next() within your loop to advance the iterator, it.hasNext() keeps returning true, and your loop rolls on. Until, that is, k gets to be 5, at which point an IndexOutOfBoundsException is thrown, which exits the loop.

The proper idiom using an iterator would be

while(it.hasNext()){
    System.out.println(it.next());
}

or using an index

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

However since Java5, the preferred way is using the foreach loop (and generics):

List<String> ac= new ArrayList<String>();
...
for(String elem : ac){
    System.out.println(elem);
}



回答2:


the point is ac.get(k) doesn't consume any element of the iterator at the contrary of it.next()




回答3:


That loop will never terminate. it.hasNext does not advance the iterator. You have to call it.next() to advance it. The loop probably terminates because k becomes 5 at which point the Arraylist with throw a bounds exception.

The correct form of iterating a list (containing strings) is either:

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

Or if the list is typed, e.g. ArrayList

for (String s : ac) {
  System.out.println((String) s);
}

Or if you absolutely know this is an array list and need speed over terseness:

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


来源:https://stackoverflow.com/questions/3635474/how-hasnext-works-in-collection-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!