一、Map简介
Map接口储存一组成对的键-值对象,提供key(键)到value(值)的映射。
Map中的key不要求有序,不允许重复。value同样不要求有序,但可以重复。
最常见的Map实现类是HashMap,他的储存方式是哈希表,优点是查询指定元素效率高。
映射关系(两个集合):A集合和B集合
* A集合中的每一个元素都可以在B集合中找到一个唯一的一个值与之对应
严格上说Map并不是集合,而是两个集合之间的映射关系(Map接口并没有继承于Collection接口)
* 然而因为Map可以存储数据(每次存储都应该存储A集合中一个元素key和B集合中一个元素value)
Key集合不允许重复,Set集合
* Value集合允许重复,List集合
二、Map映射的关系图
三、常用方法
四、Map集合的遍历
因为Map接口并没有继承于Collection接口也没有继承于Iterable接口,所以不能直接对Map使用for-each操作
1.获取Map中所有key所组成的集合(key是不能重复的,类似于Set)
public static void main(String[] args) { Map<String,Object> map=new HashMap<>(); map.put("key1", "value1"); map.put("key2", "value2"); map.put("key3", "value3"); map.put("key4", "value4"); System.out.println(map); Set<String> keys=map.keySet(); for (String key : keys) { System.out.println(key+":"+map.get(key)); //{key1=value1, key2=value2, key3=value3, key4=value4} } }
输出:
key1:value1
key2:value2
key3:value3
key4:value4
2.//获取Map中所有value所组成的集合(value可以重复)
Collection<Object> values=map.values(); for (Object object : values) { System.out.println(object); } /* value1 value2 value3 value4 * */
3.获取Map中所有的Entry(key-->value)
Set<Map.Entry<String, Object>> entrys=map.entrySet();
for (Map.Entry<String, Object> entry : entrys) { String key=entry.getKey();//获取key Object value= entry.getValue();//获取value System.out.println(key+":"+value); }
五、集合前缀相同问题
我们发现Set接口和Map接口有很多前缀相同的实现类,比如说HashSet和HashMap
如果集合前缀相同,说明底层算法是一样的,现在单独使用HashSet和HashMap来研究
* 通过阅读源代码发现,相同算法的Set底层用的是相同算法的Map
* 把Set的集合对象作为Map的Key,Object常量为value
* 因此:更符合我们所说的在Map中,所有的key就是一个Set集合
六、案例
计算一个字符串中没一个字符出现的次数
String str="dasdbsdhabsdvjasvdja"; char[] arr=str.toCharArray(); //key:存储字符名,value:存储出现次数 Map<Character,Integer> map2=new TreeMap<>(); //循环得到每一个字符 for (char c : arr) { //判断当前字符是否在Map中的key存在 if(map2.containsKey(c)) { //当前Map的key包含该字符,此时取出该value值递增1,再存放进去 Integer old=map2.get(c); map2.put(c, old+1); }else { //当前Map的key不包含该字符,把该字符存储到map中,设置value为: map2.put(c, 1); }