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

这一章节我们来讨论一下接口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<Integer> collection) {
		for (Integer item : collection) {
			System.out.print(item + " ");
		}
	}

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

	public static void main(String[] args) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		HashSet<Integer> set = new HashSet<Integer>();
		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<Person> {

	@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<Person> iterator() {
		// TODO Auto-generated method stub
		return null;
	}

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

	@Override
	public <T> 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<? extends Person> 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<Person> collection) {
		for (Person person : collection) {
			System.out.print(person.getId() + " ");
		}
	}

	public static void showItems(Iterator<Person> 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<Person> {
	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<Person> iterator() {
		return new Iterator<Person>() {
			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<Person> 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<Person> iterator() {
		return new Iterator<Person>() {
			private int index = 0;

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

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

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


相对来说,代码减少了不少。

 

总结:我们这一章节简单讨论了接口Collection与Iterator,以及一些实现和复用的例子。

 

这一章节就到这里,谢谢。

-----------------------------------

目录

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值