简单容器的分类:
图1. 简单容器的分类
在“图1”中总结出了常用容器的简单关系。可以看到,只有4类容器:List、Set、Queue、Map。上图中虚线框表示一个接口,实线框表示一个具体的实现类,虚线箭头线表示一种“实现”关系,实线箭头线表示一种“继承”关系。红线箭头不表示实现与继承关系。
为了理清楚“图1”中简单容器的关系,首先从迭代器(Iterator)的作用开始讲解。
一、迭代器
迭代器是一个对象,它的工作是遍历并选择容器中的对象,而程序员不必要知道或关心容器的底层实现(无论List、Queue、Set都采用同样的方式来对待)。迭代器是一个轻量级的对象,创建它的代价很小,同样功能也简单(比如:只能单向移动)。只具备如下的功能:
①、使用方法iterator()要求容器返回一个Iterator。Iterator将准备好返回容器的第一个元素。
②、使用next()获得容器的下一个元素。
③、使用hasNext()检查容器中是否还有元素。
④、使用remove()将迭代器新近返回的元素删除。
迭代器真正的强大在于将遍历容器的操作与容器底层结构相分离。
例如:打印包含有Person对象的容器可以写下面一个方法,只需要向打印方法中传入一个迭代器即可,至于这个容器到底是List还是Set根本不需要关心。
1 void printPerson(Iterator<Person> itr){ 2 if(itr == null) 3 return; 4 while(itr.hasNext()){ 5 Person p = itr.next(); 6 System.out.println(p.getName() + " " + p.getAge()); 7 } 8 }
Collection接口中就定义有iterator()方法,所以如果容器是List、Set、Queue则只需要直接调用对象的iterator()方法便可以得到一个迭代器对象。
但是,Map容器并没有实现Collection接口,那么一个Map类型的容器该如何获得一个迭代器对象呢?Map定义了三个Collection视角的方法:
①、map.entrySet(); 返回一个Set<Entry<T, E>>对象,SetSet<Entry<T, E>>对象中有iterator()方法。
②、map.keySet(); 返回一个Set<T>对象,Set<T>对象中有iterator()方法。
③、map.values(); 返回一个Collection<T>对象,Collection<T>对象中有iterator()方法。
下面是一个迭代器用于Map的例子:
1 import java.util.*; 2 import java.util.Map.Entry; 3 public class Main{ 4 public static void main(String args[]){ 5 6 Map<Integer, String> map = new HashMap<>(); 7 map.put(1, "aaa"); 8 map.put(2, "bbb"); 9 map.put(3, "ccc"); 10 map.put(4, "ddd"); 11 12 Set<Entry<Integer, String>> setEntry = map.entrySet(); 13 Iterator<Entry<Integer, String>> itrEntry = setEntry.iterator(); 14 System.out.println("--------map.entrySet()--------"); 15 while(itrEntry.hasNext()){ 16 Entry<Integer, String> entry = itrEntry.next(); 17 Integer key = entry.getKey(); 18 String val = entry.getValue(); 19 System.out.print(key + ":" + val + " "); 20 } 21 22 Set<Integer> setKey = map.keySet(); 23 Iterator<Integer> itrKey = setKey.iterator(); 24 System.out.println("\n\n--------map.keySet()--------"); 25 while(itrKey.hasNext()){ 26 Integer key = itrKey.next(); 27 System.out.print(key + " "); 28 } 29 30 Collection<String> values = map.values(); 31 Iterator<String> itrValues = values.iterator(); 32 System.out.println("\n\n--------map.values()--------"); 33 while(itrValues.hasNext()){ 34 String val = itrValues.next(); 35 System.out.print(val + " "); 36 } 37 }