Map操作
将对象映射到其他对象的能力是一种解决编程问题的杀手锏。例如,考虑一个程序,它将用来检查Java的Random类的随机性。理想状态下,Random可以将产生理想的数字分布,但要想测试它,则需要生成大量的随机数,并对落入各种不同范围的数字进行计数。Map可以很容易地解决该问题。在本例中,键是由Random产生的数字,而值是该数字出现的次数。
package p10;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class Statistics {
public static void main(String[] args) {
Random rand = new Random(47);
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0;i < 10000;i++){
// Produce a number between 0 and 20
int r = rand.nextInt(20);
Integer freq = map.get(r);
map.put(r,freq == null?1:freq+1);
}
System.out.println(map);
/**
* {0=481, 1=502, 2=489, 3=508, 4=481, 5=503, 6=519, 7=471, 8=468, 9=549,
* 10=513, 11=531, 12=521, 13=506, 14=477, 15=497, 16=533, 17=509, 18=478, 19=464}
*/
}
}
在main()中,自动包装机制将随机生成的int转换为HashMap可以使用的Integer引用(不能使用基本类型的容器)。如果键不在容器中,get0方法将返回null(这表示该数字第一次被找到)。否则,get()方法将产生与该键相关联的Integer值,然后这个值被递增(自动包装机制再次简化了表达式,但是确实发生了对Integer的包装和拆包)。
下面的示例允许你使用一个String描述来查找Pet,它还展示了你可以使用怎样的方法通过使用containsKey()和containsValue()来测试一个Map,以便查看它是否包含某个键或某个值。
package p10;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
public class PetMap {
public static void main(String[] args) {
Map<String,Pet> petMap = new HashMap<>();
petMap.put("My Cat",new Cat("Molly"));
petMap.put("My Dog",new Dog("Ginger"));
petMap.put("My Hamster",new Hamster("Bosco"));
System.out.println(petMap);
Pet dog = petMap.get("My Dog");
System.out.println(dog);
System.out.println(petMap.containsKey("My Dog"));
System.out.println(petMap.containsValue(dog));
/**
* {My Dog=Dog Ginger, My Cat=Cat Molly, My Hamster=Hamster Bosco}
* Dog Ginger
* true
* true
*/
}
}
Map与数组和其他的Collection一样,可以很容易地扩展到多维,而我们只需将其他设置为Map(这些Map的值可以使其他容器,甚至可以是其他Map)。因此,我们能够很容易地将容器组合起来从而快速地生成强大的数据结构。例如,假设你正在跟踪拥有多个宠物的人,你所需的只是一个Map<Person,List>