A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 小北京 初级黑马   /  2018-11-20 15:17  /  843 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Map集合的概述:
Map集合的特点:(1)是双列集合.一个元素包含两个值(键key,值Value)一个键值对.
     (2)key和Value的类型可以相同,也可以不同.
     (3)key的值不可以重复,Value的值可以重复.
      (4)key和Value一一是对应的.


Map常用子类:
HashMap<K, V>类: 底层哈希表. key存取无序不可重复  
                 LinkedHashMap<K, V>类: 底层哈希表+链表. key存取有序不可重复.




HashSet底层使用的就是HashMap
LinkedHashSet底层使用的就是LinkedHashMap


Map中常用的方法:
java.util.Map接口: 双列集合的顶层
        // 成员方法
        V put(K key, V value): 添加/修改 键值对.
            如果键存在, 则用新值替换已有值, 返回被替换的值; 如果键不存在, 添加键值对,返回null
        V remove(Object key): 根据键删除键值对, 返回被删除元素的值
                如果键不存在, 返回null
        V get(Object key): 根据键获取值.
            如果键不存在, 则返回null
        boolean containsKey(Object key): 判断是否包含指定的键
       
        Set<K> keySet(): 获取Map集合中所有的键, 存储到Set集合中
        Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的Entry对象的集合(Set集合)


Map遍历方式:KeySet()方法通过键找值:
Set<K> keySet(): 获取Map集合中所有的键, 存储到Set集合中
       
keySet()遍历步骤:
        1. Map对象调用 keySet() 方法, 获取包含所有key的Set集合
        2. 遍历Set集合, 获取每个key
        3. 通过Map对象调用 get(Object key) 方法根据key获取到value
       
        Map<String, String> map = new HashMap<>();
        // keySet()遍历
        Set<String> keys = map.keySet();
        for (String key : keys) {
                // 通过每个键获取值
                String value = map.get(key);
                // 打印当前键值对
                System.out.println(key + "=" + value);
        }




Entry键值对对象介绍:
java.util.Map.Entry接口:
        // 常用成员方法
        K getKey(): 获取Entry对象中的键
        V getValue(): 获取Entry对象中的值
       
Entry对象就是一个节点, 节点中存储了key和value
拿到一个Entry对象就可以从中获取key和value
       
        // HashMap中Entry实现类
        static class Node<K,V> implements Map.Entry<K,V> {
            final int hash;
            final K key;
            V value;
            Node<K,V> next;


            public final K getKey() {
                return key;
            }
        
            public final V getValue() {
                return value;
            }
        }


java.util.Map接口
        Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)


通过entrySet()获取Entry对象形式遍历:
ntrySet()方法遍历Map步骤:
        1. Map对象调用 entrySet() 获取包含所有Entry对象的Set集合
        2. 遍历Set集合, 获取每个Entry对象
        3. 调用Entry对象的 getKey() 和 getValue() 方法获取键和值


HashMap存储自定义数据类型作为键
HashMap存储自定义JavaBean对象作为key保证key唯一不重复, 需要让JavaBean重写 hashCode() 和 equals() 方法


LinkedHashMap:
LinkedHashMap底层: 哈希表 + 链表
        key不允许重复, 但key存取有序


Hashtable:
Hashtable和HashMap:
        相同点:
                1. 底层都是哈希表
        不同点:
                1. Hashtable不允许存储 null 值和 null 键; HashMap允许存储 null 值和 null 键
                2. Hashtable线程安全效率低; HashMap线程不安全效率高
               
Hashtable目前很少使用.
但其子类 Properties 集合, 可以与IO流结合使用, 应用较多


Jdk9对集合添加的优化:
使用集合添加大量元素时, 反复add(...)比较麻烦. JDK 9 为集合提供了一些静态方法, 可以方便的对集合进行初始化


java.util.List接口:
        // 静态方法
        static List<E> of(E... e): 返回包含指定元素的 不可变List 集合
       
java.util.Set接口:
        // 静态方法
        static Set<E> of(E... e): 返回包含指定元素的 不可变Set 集合
       
java.util.Map接口:
        // 静态方法
        static Map<K, V> of(K k1, V v1, ...): 返回包含指定键值对的 不可变Map 集合
       
注意事项:
        1. of() 方法只适用于List接口, Set接口, Map接口, 不适用于接口的实现类
        2. of() 方法的返回值是一个不可变的集合, 集合不能再使用 add(), put() 方法添加元素, 会抛出异常
        3. Set接口和Map接口在调用 of() 方法的时候, 不能有重复的元素, 否则会抛出异常

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马