在上一讲 JavaSE第四十八讲:Map深入详解及遍历Map的两种实现手段 中已经介绍了第一种遍历Map的手段:利用keySet()方式得到key的信息的Set 集合,然后去遍历这个这个集合,取出每一个key,然后通过get方法就可以得到Map中的键值对的所有信息了。
这一讲将要说另外一种遍历Map的实现,这种方法相对第一种要更简单一些。
查看JDK Doc文档Map中的Map.Entry<K, V>
[注意:这是一个成员变量,这边Map.Entry表示的时候Entry是Map内部类]
内部类及实例内部类的写法:
public class A{
public classB{
}
}
A a = new A();
A.B b = new A.B();
[说明:其实内部类很复杂,这边只是大概一个概括,将来会有另起一讲专门将内部类的使用方法]
继续查看Map中跟Entry相关的方法:entrySet()
entrySet
Set<Map.Entry<K,V>> entrySet()Returns a Set view of the mappings contained in this map. The set is backed by the map, so changes to the map are reflected in the set, and vice-versa.
[返回的是一个包含在Map当中的映射的Set视图],联系上一讲中第一种遍历Map的方法,keySet()返回Set视图,values()返回Collection视图。
联系以下程序,掌握其用法:
package com.ahuier2; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class MapTest5 { public static void main(String[] args) { HashMap map = new HashMap(); map.put("a", "aa"); map.put("b", "bb"); map.put("c", "cc"); map.put("d", "dd"); Set set = map.entrySet(); for(Iterator iter = set.iterator(); iter.hasNext();){ //这边要强制类型转换,所以要知道其子类型,这边可以知道其子类型为Map.Entry类型 Map.Entry entry = (Map.Entry)iter.next(); String key = (String)entry.getKey(); String value = (String)entry.getValue(); System.out.println(key + " : " + value); } } }编译执行结果:d : dd
b : bb
c : cc
a : aa
Map.Entry这个类型维护着一对信息,其中一个是key,一个是value(getKey() 和 getValue())
getKey() Returns the key corresponding to this entry. [返回entry中的key信息]
getValue() Returns the value corresponding to this entry. [返回entry中的value信息]
结合上一讲第一种实现遍历Map方式(程序MapTest3),对比利用entry对象遍历Map方法,可以发现后者是通过entry对象所维护的键值,一下子拿到他们一对的信息,前者通过拿到Map中的键的信息,通过遍历Map中的键,然后取出相对于键的值,其实这两种实现方式外层看来有些不同,底层实现方式是有很多类似的。底层实现方式将在下一讲详细分析。在使用过程中,可以根据自己喜欢使用一种。
作业:
1. 随机生成50个数字(整数),每个数字的范围是[10, 50],统计每个数字出现的次数以及出现次数最多的数字与它的个数,最后将每个数字及其出现次数打印出来,如果某个数字出现次数为0,则不要打印它。打印时按照数字的升序排列。【使用集合实现,不允许使用数组。】
2. 策略模式(Strategy Pattern)。通过查询资料掌握策略模式的原理。
在我们之前涉及到迭代器中发现:TreeSet是不会变化的,变化的是比较器,由比较器的变化引起了TreeSet中的变化的过程。这种模式称为:策略模式
3. 阅读TreeMap的帮助文档,自己写一个程序,练习TreeMap的使用方式并且自己定义一个Comparator。