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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 1597854328 中级黑马   /  2018-12-28 09:32  /  645 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Map体系
Map集合概述
java.util.Map<K, V>接口

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

Map集合适合存储一对一关系的数据
Map常用子类
java.util.Map<K, V>接口: 双列集合的根接口, 规定了共性的方法
        |
        |_ HashMap<K, V>类: 底层哈希表. key存取无序不可重复
                |_ LinkedHashMap类: 底层哈希表+链表. key存取有序不可重复
               
映射: 键和值的对应关系 mapping

HashSet底层使用的就是HashMap
LinkedHashSet底层使用的就是LinkedHashMap
Map中常用方法
Map<String, Phone> map = new HashMap<>();
map.put("张三", p1);
map.put("张三", p2);

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

+---------------+
| K key, V value|
+---------------+

    public class Entry {
        K key;
        V value;
        K getKey();
        V getValue();
    }

5分钟练习: 测试Map常用方法
需求:
创建HashMap对象, 存储键值对都是String, 存储以下键值对
        黄晓明, 杨颖
        文章, 马伊琍
        邓超, 孙俪
删除文章马伊琍, 获取邓超的老婆打印出来, 判断键中是否有黄晓明
[AppleScript] 纯文本查看 复制代码
需求:
创建HashMap对象, 存储键值对都是String, 存储以下键值对
    黄晓明, 杨颖
    文章, 马伊琍
    邓超, 孙俪
删除文章马伊琍, 获取邓超的老婆打印出来, 判断键中是否有黄晓明
 */
public class Test {
    public static void main(String[] args) {
        // 创建HashMap对象
        Map<String, String> map = new HashMap<>();
        // 添加键值对
        map.put("黄晓明", "杨颖");
        map.put("文章", "马伊琍");
        map.put("邓超", "孙俪");
        System.out.println(map);
 
        // 删除文章马伊琍
        String v = map.remove("文章");
        System.out.println("删除文章后的返回值:" + v);
        System.out.println(map);
 
        // 获取邓超的老婆打印出来
        String v2 = map.get("邓超");
        System.out.println("邓超老婆:" + v2);
 
        // 判断键中是否有黄晓明
        boolean contains = map.containsKey("黄晓明");
        System.out.println("是否包含黄晓明:" + contains);
    }
}

    Map遍历方式一: keySet()方法实现通过键找值
Set<K> keySet(): 获取Map集合中所有的键, 存储到Set集合中
        
keySet()遍历步骤:
        1. Map对象调用 keySet() 方法, 获取包含所有key的Set集合
        2. 遍历Set集合, 获取每个key
        3. 通过Map对象调用 get(Object key) 方法根据key获取到value
[Java] 纯文本查看 复制代码
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);
    }


5分钟练习: keySet()遍历Map
需求:
创建HashMap集合, 存储以下键值对
        "赵丽颖", 168
        "杨颖", 165
        "林志玲", 178
使用keySet()方式遍历Map, 打印键值对, 效果:
        林志玲=178
        赵丽颖=168
        杨颖=165

[AppleScript] 纯文本查看 复制代码
需求:
创建HashMap集合, 存储以下键值对
    "赵丽颖", 168
    "杨颖", 165
    "林志玲", 178
使用keySet()方式遍历Map, 打印键值对, 效果:
    林志玲=178
    赵丽颖=168
    杨颖=165
 */
public class Test {
    public static void main(String[] args) {
        // 创建Map对象
        HashMap<String, Integer> map = new HashMap<>();
 
        map.put("赵丽颖", 168);
        map.put("杨颖", 165);
        map.put("林志玲", 178);
 
        // 遍历方式1: keySet()
        Set<String> keys = map.keySet();
        for (String key : keys) {
            // 通过键获取值
            Integer value = map.get(key);
            // 打印
            System.out.println(key + "=" + value);
        }
 
        System.out.println("-------------");
 
        // 简化方式
        for (String key : map.keySet()) {
            // 通过键获取值
            Integer value = map.get(key);
            // 打印
            System.out.println(key + "=" + value);
        }
    }
}

LinkedHashMap底层: 哈希表 + 链表
        key不允许重复, 但key存取有序
LinkedHashSet的底层就是使用LinkedHashMap实现的
Hashtable类
Hashtable和HashMap:
        相同点:
                1. 底层都是哈希表
        不同点:
                1. Hashtable不允许存储null值和null键; HashMap允许存储null值和null键
                2. Hashtable线程安全效率低; HashMap线程不安全效率高
               
Hashtable目前很少使用

Properties集合

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

Map接口: 双列集合的根接口, 规定了共性的方法
        |_ HashMap类: 底层哈希表=数组+链表+红黑树. key无序不可重复, 可存null键null值, 线程不安全效率高
        |        |_ LinkedHashMap类: 哈希表+双向链表. 哈希表实现key不可重复, 双向链表实现key存取有序
        |
        |_ Hashtable类: 底层哈希表. Hash特性针对key, key无序不可重复, 不可存null键null值, 线程安全效率低
        |_ TreeMap类: 底层红黑树结构(存入时就排序). Tree特性针对key, 可以按照key排序, 要求key具备比较性
        |_ 遍历
                |_ keySet(): 获取所有key组成的Set集合, 遍历Set集合拿到key, 通过Map的get(key)得到value
                |        |_ 对于Set<Key>的遍历
                |                |_ 增强for
                |                |_ 迭代器
                |_ entrySet(): 获取所有的key和value组成的Entry对象的Set集合, 遍历出entry对象, 通过entry对象的getKey()获取对应的key, 通过Entry对象的getValue方法获取对应的value
                        |_ 对Set<Entry>的遍历
                                |_ toArray()
                                |_ 增强for
                                |_ 迭代器

0 个回复

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