Map接口

1、Map概述

1.1 什么是Map

Map是将键映射到值( key-value )的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。Map 接口提供三种collection 视图,允许以键集(keySet())、值集(values())或键-值映射关系集(entrySet())的形式查看某个映射的内容( 即获取键值对的内容 )。

映射顺序定义为迭代器在映射的 collection 视图上返回其元素的顺序,即可以映射得到键、值和键-值的Set集合,元素的顺序是由得到的Set集合所决定的。某些映射实现可明确保证其顺序,如 TreeMap 类;另一些映射实现则不保证顺序,如 HashMap 类 。

1.2 Map与Collection的区别

  • 1.Map 存储的是键值对形式的元素,键唯一,值可以重复。
  • 2.Collection 存储的是单列元素,子接口Set元素唯一,子接口List元素可重复。
  • 3.Map集合的数据结构值针对键有效,跟值无关,Collection集合的数据结构是针对元素有效

    2、Map继承体系

    下面列出了常见Map集合的继承体系与他们的特点

    ---Map 键唯一
        |------HashMap
        基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 此实现不是同步的。
            |------LinkedHashMap
        Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序)。此实现不是同步的
        |------WeakHashMap
        以弱键 实现的基于哈希表的 Map。在 WeakHashMap 中,当某个键不再正常使用时,将自动移除其条目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。丢弃某个键时,其条目从映射中有效地移除,null 值和 null 键都被支持。
        |------Hashtable
        此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。        Hashtable 是同步的 
    
        |------TreeMap
        基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。 此实现不是同步的
    

    3、Map泛型接口

    Map特点 : 由key-value键值对组成,键不可重复,值可重复

    大致包含如下功能:

    • 插入(put、putAll())、删除(remove())
    • 获取(entrySet()、get()、keySet()、size()、values())
    • 判断(containsKey()、containsValue()、equals()、isEmpty())、清除(clear())
    • 替换(replace(),replace(K key, V oldValue, V newValue) jdk1.8之后,后面示例会讲到它们)

      方法摘要

     void clear() 
              从此映射中移除所有映射关系(可选操作)。 
     boolean containsKey(Object key) 
              如果此映射包含指定键的映射关系,则返回 trueboolean containsValue(Object value) 
              如果此映射将一个或多个键映射到指定值,则返回 trueSet<Map.Entry<K,V>> entrySet() 
              返回此映射中包含的映射关系的 Set 视图。 
     boolean equals(Object o) 
              比较指定的对象与此映射是否相等。 
     V get(Object key) 
              返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。 
     int hashCode() 
              返回此映射的哈希码值。 
     boolean isEmpty() 
              如果此映射未包含键-值映射关系,则返回 trueSet<K> keySet() 
              返回此映射中包含的键的 Set 视图。 
     V put(K key, V value) 
              将指定的值与此映射中的指定键关联(可选操作)。 
     void putAll(Map<? extends K,? extends V> m) 
              从指定映射中将所有映射关系复制到此映射中(可选操作)。 
     V remove(Object key) 
              如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。 
     int size() 
              返回此映射中的键-值映射关系数。 
     Collection<V> values() 
              返回此映射中包含的值的 Collection 视图。

    3.1、 Map集合遍历的常见方式

    方式1、根据键获取值(key -> value)

    1.获取所有键的集合
    2.遍历键的集合,获取到每一个键
    3.根据键找值
    

    方式2、根据键值对对象获取键和值( entrySet -> key,value)

    1.获取所有键值对对象的集合
    2.遍历键值对对象的集合,获取到每一个键值对对象
    3.根据键值对对象找键和值
    

    3.11 Map使用示例

    public class MapReview {
        public static void main(String[] args) {
            Map<String, String> map=new HashMap<String, String>();
            map.put("000", "qqq");
            map.put("003", "rrr");
            map.put("001", "www");
            map.put("002", "eee");
            map.put("004", "sss");
    
            // System.out.println(map);  // 直接打印输出键值对
    
            // 遍历1 : 通过键值对对象entrySet获取键与值
            Set<Entry<String, String>> entrySet = map.entrySet();
            for (Entry<String, String> entry : entrySet) {
                String key = entry.getKey();
                String value = entry.getValue();
                System.out.println("key="+key+" value="+value);
            }
            System.out.println("-------------------");
    
            // 遍历2 : 通过键keySet获取值
            Set<String> keySet = map.keySet(); // 得到键的集合
            for (String key : keySet) {
                String value = map.get(key);
                System.out.println("key="+key+" value="+value);
            }
            System.out.println("-------------------");
    
            // 获取Map值的集合
            Collection<String> values = map.values();
            System.out.println(values);
    
            // 判断是否存在键和值
            System.out.println("containsKey="+map.containsKey("001"));
            System.out.println("containsKey="+map.containsValue("eee"));
    
            // 向Map集合添加元素时,若键存在,则返回之前与键对应的值
            String put = map.put("000", "aaa");
            System.out.println("put="+put); // output: qqq
    
            //  default V replace(K key, V value)
            //  替换功能,将旧值替换成新值,并返回旧值(若有的话)
            String replace = map.replace("003", "666");
            System.out.println("replace="+replace);
            System.out.println(map);
    
            // default boolean replace(K key, V oldValue, V newValue
            // 只有当键key存在,并且oldValue与newValue相等时,旧的值才会被替换成新的值,并且返回true
            boolean success = map.replace("004", "sss", "lll"); 
            System.out.println("replace2="+success); // output : true
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值