您的位置:首页 > 编程语言 > Java开发

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

2015-11-21 21:56 295 查看
这一章节我们来讨论一下接口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,以及一些实现和复用的例子。
 这一章节就到这里,谢谢。-----------------------------------目录
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java