比较C#和Java中的迭代器同时也是自己的学习吧

原因:

平时写程序用到的是 C#中的foreach或者是Java中的增加for循环来遍历,今天看了Java的JDK文档于是自己思考了下,来写一篇博客,顺便也提供参考吧

C#中的迭代

要说到在C#中使用迭代就要用到IEnumerable接口,但同时呢IEnumerable接口包含一个GetEnumerator方法,返回值为IEnumerator的类型

具体测试代码如下:

首先创建一个Student类,随便重写下toString方法

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace TestDemo
 7 {
 8     public class Student
 9     {
10         public int stuNum { get; set; }
11         public string stuName { get; set; }
12         public Student(int stuNum,string stuName)
13         {
14             this.stuName = stuName;
15             this.stuNum = stuNum;
16         }
17         public override string ToString()
18         {
19             return this.stuNum + " " + stuName;
20         }
21     }
22 }
Student

接下来就是测试代码了:

public static void Main(string[] args)
        {
            List<Student> mystu = new List<Student> 
            {
                new Student(1,"David"),
                new Student(2,"Tome"),
                new Student(3,"Zhang"),
                new Student(4,"cnblog")
            };
            //IEnumerable<Student> result = mystu.Where(stu => stu.stuNum>=2);
            foreach(Student s in result)
            {
                Console.WriteLine(s);
            }
            Console.WriteLine("--------------");
            IEnumerator<Student> IES = result.GetEnumerator();
            //IES.Reset();
            while(IES.MoveNext())
            {
                Console.WriteLine(IES.Current);
            }
            Console.ReadKey();
        }

恩,好,接着我们来一起看下Java中的迭代器

首先创建Student类,随便也重写下toString方法

 1 public class Student {
 2     
 3     public Student(){
 4         
 5     }
 6     public Student(int stuNum,String stuName){
 7         this.stuNum = stuNum;
 8         this.stuName = stuName;
 9     }
10     public int stuNum;
11     public String stuName;
12     public int getStuNum() {
13         return stuNum;
14     }
15     public void setStuNum(int stuNum) {
16         this.stuNum = stuNum;
17     }
18     public String getStuName() {
19         return stuName;
20     }
21     public void setStuName(String stuName) {
22         this.stuName = stuName;
23     }
24     
25     //重写toString()方法
26     public String toString(){
27         return this.stuNum+" "+stuName;
28     }
29 }
View Code

下面是测试代码:

public static void main(String[] args) {
		List<Student> Ls = new ArrayList<Student>();
		Ls.add(new Student(1,"David Zhang"));
		Ls.add(new Student(2,"Mr.Smart"));
		Ls.add(new Student(3,"cnblog"));
		
		//一个增加for循环输出
		for (Student student : Ls) {
			System.out.println(student);
		}
		System.out.println("=---------=");
		//使用迭代器迭代
		Iterator<Student> Iter = Ls.iterator();
		while(Iter.hasNext()){
			Student stu = Iter.next();
			System.out.println(stu);
		}
		
	}

恩,好了,到现在为止我们已经把所要测试比较的代码贴出来了,下面首先说说我对C#的思考:

我们在C#中使用了foreach进行遍历,这就意味着这个foreach实现了IEnumerable和IEnumerator接口,这也进一步的说明了程序运行时编译器会到这个对象的类中去寻找GetEnumerator方法,找到这个方法后返回这个一个IEnumerator的对象,就其中的current(),Reset(),MoveNext()方法我就不再多说了,从字面就可以知道这个方法的作用了。

关于java中的迭代自己的想法与思考

首先呢要实现Iterator接口,具体的思路就是通过对象调用iterator方法,每个集合均可创建并返回一个实现Iterator的对象,并且呢将当前位置的概念在对象内存中存储下来。关于它的hasNext(),next(),remove(),方法在这我就不多说啥了,JDK有详细说明。

注意点:

这个注意点呢,就是在C#和Java中都有体现的,就是在C#中首先要对象调用MoveNext()方法获得第一个元素,在Java中的对象首先要调用next()方法获取第一个元素。不然会报错!

在此我要说的就是这些了,有什么不足或者不对的地方,point out.  Thanks

posted @ 2013-12-15 02:11  strucoder  阅读(380)  评论(0编辑  收藏  举报