从头认识java-9.12 接口Collection与Iterator

页面导航:首页 > 软件编程 > Java编程 > 从头认识java-9.12 接口Collection与Iterator

从头认识java-9.12 接口Collection与Iterator

来源: 作者: 时间:2016-01-21 09:39 【

这一章节我们来讨论一下接口Collection与Iterator。1 在Collection与Map的实现类里面,其实都实现了Collection与Iterator接口。package com ray ch09;import java util ArrayList;import java util Col

这一章节我们来讨论一下接口Collection与Iterator。

1.在Collection与Map的实现类里面,其实都实现了Collection与Iterator接口。

package com.ray.ch09;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;

public class Test {

	public static void showItems(Collection collection) {
		for (Integer item : collection) {
			System.out.print(item +  );
		}
	}

	public static void showItems(Iterator iterator) {
		while (iterator.hasNext()) {
			Integer item = iterator.next();
			System.out.print(item +  );
		}
	}

	public static void main(String[] args) {
		ArrayList list = new ArrayList();
		HashSet set = new HashSet();
		for (int i = 0; i < 10; i++) {
			list.add(i);
			set.add(i);
		}
		showItems(list);
		System.out.println();
		showItems(set);
		System.out.println();
		showItems(list.iterator());
		System.out.println();
		showItems(set.iterator());
		System.out.println();
	}
}


从上面的代码都可以看见,list和set都分别实现了Collection与Iterator,因此可以通过向上转型来调用里面的方法。

 

2.当我们有一个对象想复用类似showItem这种遍历方法的时候,他必须实现Collection或Iterator,而且实现Iterator比较容易。

Collection:

package com.ray.ch09;

import java.util.Collection;
import java.util.Iterator;

public class Test {
}

class Person implements Collection {

	@Override
	public int size() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean contains(Object o) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public Iterator iterator() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object[] toArray() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public  T[] toArray(T[] a) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean add(Person e) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean remove(Object o) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean containsAll(Collection  c) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean addAll(Collection  c) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean removeAll(Collection  c) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean retainAll(Collection  c) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void clear() {
		// TODO Auto-generated method stub

	}
}


上面的实例代码我们可以看见,实现起来是非常麻烦的一件事情,达不到代码重用所应有的提供开发效率的效果。

我们知道有一个AbstractCollection实现了上面的接口,我们来继承它看看。

package com.ray.ch09;

import java.util.AbstractCollection;
import java.util.Collection;
import java.util.Iterator;

public class Test {
	public static void showItems(Collection collection) {
		for (Person person : collection) {
			System.out.print(person.getId() +  );
		}
	}

	public static void showItems(Iterator iterator) {
		while (iterator.hasNext()) {
			Person person = iterator.next();
			System.out.print(person.getId() +  );
		}
	}

	public static void main(String[] args) {
		PersonList personList = new PersonList();
		showItems(personList);
		System.out.println();
		showItems(personList.iterator());
	}

}

class Person {
	private int id = 0;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

}

class PersonList extends AbstractCollection {
	private Person[] persons = new Person[10];

	public PersonList() {
		for (int i = 0; i < persons.length; i++) {
			Person person = new Person();
			person.setId(i);
			persons[i] = person;
		}
	}

	@Override
	public Iterator iterator() {
		return new Iterator() {
			private int index = 0;

			@Override
			public boolean hasNext() {
				return index < persons.length;
			}

			@Override
			public Person next() {
				return persons[index++];
			}

			@Override
			public void remove() {// 以后会展开实现
			}
		};
	}

	@Override
	public int size() {
		return persons.length;
	}
}


相对来说我们展现的例子就简单了一些,但是需要注意,继承了这个抽象类其实里面有很多方法是需要自己实现,只不过他里面没有给出来而已,就像我们的例子,必须自己初始化person的数组,不能使用外部add,因为在抽象类里面的实现,add是抛异常的。

 

Iterator:

相对来说Iterator就简单优雅多了。

package com.ray.ch09;

import java.util.Iterator;

public class Test {

	public static void showItems(Iterator iterator) {
		while (iterator.hasNext()) {
			Person person = iterator.next();
			System.out.print(person.getId() +  );
		}
	}

	public static void main(String[] args) {
		PersonList personList = new PersonList();
		showItems(personList.iterator());
	}

}

class Person {
	private int id = 0;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

}

class PersonList  {
	private Person[] persons = new Person[10];

	public PersonList() {
		for (int i = 0; i < persons.length; i++) {
			Person person = new Person();
			person.setId(i);
			persons[i] = person;
		}
	}

	public Iterator iterator() {
		return new Iterator() {
			private int index = 0;

			@Override
			public boolean hasNext() {
				return index < persons.length;
			}

			@Override
			public Person next() {
				return persons[index++];
			}

			@Override
			public void remove() {// 以后会展开实现
			}
		};
	}
}

 

 

 

Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<