entry、map、iterator之间的联系
经常用到HashMap,一直不知道怎么遍历,最近终于有点头绪了。
第一种方式:使用entry
我们经常说map里面存的是键值对,这句话是什么意思呢,就是map里面存了很多< key,value>这种形式的数据。那么键值对在对象里面怎么表示的呢?
就是用entry表示的。一个entry表示一个< key,value>。遍历map实际上就是要获取到每个entry,java里面对map对象提供了一个方法:
map.entrySet()
:用于返回一个存放了很多entry的集合set。
我们知道遍历一个数组可以用增强for-each循环,比如:
for(int i:array){
System.out.println(i);
}
同样的,集合遍历的方式也可以用增强for-each循环。问题来了,我们已经有了后面的set:通过map.entrySet()获得,怎么样取得前面的entry类型呢?
java同样提供了一个方法来获取到这个entry:
map.Entry<Object,Object>
代码示例:
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(map.Entry<Integer,Integer> entry:map.entrySet()){
System.out.println(entry.getKey()+":"+entry.getValue());
}
第二种方式:使用Iterator
首先介绍以下什么是Iterator(迭代器)——java.util.Iterator,它是一个标准化遍历各类容器里面的所有对象的方法类。它是一个接口,我们不能直接实例化它,但是能通过一些存储结构如list,set等中的方法获得它的实现类实例化的对象。
有以下三个主要方法:
Object next():返回迭代器刚越过的元素的引用,返回值是Object,需要强制转换
boolean hasNext():判断容器内是否还有可供访问的元素
void remove():删除迭代器刚越过的元素
Iterator是可以带泛型的,如Iterator< Object>,Object表示遍历出来的每一个对象。
那么对于map来说,遍历出来的是键值对,也就是entry,回忆第一种方式,要获得map对应的entry类,可以使用:map.Entry<Object,Object>
于是迭代器写成:Iterator<map.Entry<Object,Object>> iterator
如何实例化键值对的Iterator呢?我们知道map可以返回存放了entry的集合set,而集合可以返回iterator,于是可以这样写:map.entrySet().iterator()
代码示例:
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
Iterator<map.Entry<Integer,Integer>> iterator = map.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<Integer,Integer> entry = iterator.next();
System.out.println(entry.getKey()+":"+entry.getValue());java
}