zoukankan      html  css  js  c++  java
  • Java基础24-集合类3(Map接口)

    一、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);
        }
  • 相关阅读:
    Interview with BOA
    Java Main Differences between HashMap HashTable and ConcurrentHashMap
    Java Main Differences between Java and C++
    LeetCode 33. Search in Rotated Sorted Array
    LeetCode 154. Find Minimum in Rotated Sorted Array II
    LeetCode 153. Find Minimum in Rotated Sorted Array
    LeetCode 75. Sort Colors
    LeetCode 31. Next Permutation
    LeetCode 60. Permutation Sequence
    LeetCode 216. Combination Sum III
  • 原文地址:https://www.cnblogs.com/LuckyGJX/p/9119537.html
Copyright © 2011-2022 走看看