我在看研究二叉树的时候遇到一个问题,就是Iterator在递归函数中好像不会被挂起而是继续往下个元素移动。我这样说可能有点乱。我写了个测试小程序,大家帮我看看。package org.crosswire.common.compress;import java.util.Arrays;
import java.util.Iterator;
import java.util.List;public class Test {
public void test(Iterator it){
Object o=it.next();
if(o==null){
System.out.println("null");
}else{
System.out.println(o.toString());
}
if(o!=null){
test(it);
test(it);
}
}
public void test2(String[] it){
String str=it[0];
String temp[]=new String[it.length-1];
for(int i=0;i<temp.length;i++){
temp[i]=it[i+1];
}
if(str==null){
System.out.println("null");
}else{
System.out.println(str);
}
if(str!=null){
test2(temp);
test2(temp);
}
}
public static void main(String args[]){
Test t=new Test();
Object o[]=new Object[]{"1","2",null,null,null};
List l=Arrays.asList(o);
System.out.println("----------------test--------------");
t.test(l.iterator());
String[] it=new String[]{"1","2",null,null,null};
System.out.println("----------------test2--------------");
t.test2(it);
}
}上面两个递归函数,第一个是使用Iterator的,第二个是我按照Iterator的表面模拟的他的移动(我没有研究过Iterator是如何实现的,就只是根据他的方法结果模拟的,肯定是用问题的)。
然后输出结果如:
----------------test--------------
1
2
null
null
null
----------------test2--------------
1
2
null
null
2
null
null上面两个结果说明了在test函数当中,Iterator是一直往下一个元素前进。而test2中,当读取到null递归返回到挂起的位置,它数组中的元素也回到了挂起的位置。也就是说test2始终只会在前三个元素就行操作,null就是临界点了。但是Iterator为什么就不行呐?假如我Iterator中的元素是"1","2",null的话,程序还会抛出NoSuchElement的异常。我想知道这是怎么回事,如果是在C或C++当中,我可能可以理解,但是Java当中我很难理解啊?
谢谢大家了。

解决方案 »

  1.   

    我不知道怎么用可不可以啊,一般用Iterator的话,以ArrayList的实例list为例:Iterator iterator = list.iterator();while(iterator.hasNext())
       System.out.print(iterator.next() +", ");
      

  2.   

    1、没看明白这个程序跟二叉树有什么关系,你好像没建二叉树啊
    2、Iterator是只能向后移动的,不能往回移动,这是因为Iterator是由系统管理的,跟普通变量的行为不太一样
    楼主,把你的main方法改成下面这样,或许你会加深理解
    public static void main(String args[])
    {
    test t = new test();
    Object o[] = new Object[]{"1", "2", null, null, null};
    List l = Arrays.asList(o);
    java.util.Iterator it1 = l.iterator();
    t.test(it1);
    it1=l.iterator();//先运行一次,把这行注释掉再运行一次
    t.test(it1);
    }
      

  3.   


    这里只是个代码片断,那个源代码里面用了个Iterator来遍历树中的元素。就用了递归方式,所以不太明白为什么Iterator不会在挂起处回到前一个元素位置,听你这么一说,有点明白了,我先去按照你的方式跑下程序。
      

  4.   

    回三楼:
    试过了,现在明白了,有点像C当中的应用调用,是自己对变量本身的值进行的操作,而不是对它的拷贝进行操作。大概表面现象是这样的,不过Java当中没有指针,具体他是怎么处理的还是得看源代码。
    谢谢了先!