Java基础24-集合类3(Map接口)

时间:2023-02-15 10:11:25

一、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映射的关系图

Java基础24-集合类3(Map接口)

三、常用方法

Java基础24-集合类3(Map接口)

Java基础24-集合类3(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);
    }