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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 键盘有花生油 初级黑马   /  2018-11-20 16:11  /  503 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 键盘有花生油 于 2018-11-20 16:41 编辑
Day04 Map集合<k,v>两个泛型
java.util.Map<K, V>接口

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

l  Map集合适合存储"一对一关系"的数据
       夫妻
       String: Phone
       统计次数: 某个字符出现了多少次 "aaababababba"
              'a':1
       'b': 3
适合存储“一对一关系”的数据  例如夫妇  
统计次数:某个字符出现了多少次
l     Map常用子类HashMap<k,v>实现类和他的子类LinkedHashMap
java.util.Map<K, V>接口: 双列集合的根接口, 规定了共性的方法
       |_HashMap<K, V>类: 底层哈希表.key存取无序不可重复  
              |_LinkedHashMap<K, V>类: 底层哈希表+链表. key存取有序不可重复
映射: 键和值的对应关系mapping
HashSet底层使用的就是HashMap
LinkedHashSet底层使用的就是LinkedHashMap


l  // 成员方法
树     
    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集合)
entry 节点

public classEntry<K,V> {  // 键值对 对象
        K key;
        V value;
    }

l  1.建立Put方法   建立多态 方法添加的元素 k不能重复,返回v是null重复返回新的v值

l  2.建立方法Remove 删除集合元素 删除K返回v 没有k返回null

l  3.建立get方法获取元素  获取k返回v没有k返回null


l  4.建立containsKey 获取元素是否在集合中 有的话返回ture 没有false

Map集合的第一种keySet()遍历方式:通过键找值的方式
Map集合中的方法:
    Set<K> keySet() 返回此映射中包含的键的 Set 视图。
实现步骤:
    1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中
    2.遍历set集合,获取Map集合中的每一个key
    3.通过Map集合中的方法get(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);
       }
l  迭代器方法可以增删

l  也可以通过增强for循环  只是遍历建议使用增强for循环


java.util.Map.Entry接口:
l  // 常用成员方法
树     
       K getKey(): 获取Entry对象中的键
       V getValue(): 获取Entry对象中的值

Entry对象就是一个节点, 节点中存储了key和value
拿到一个Entry对象就可以从中获取key和value

       // HashMap中Entry实现类
       static class Node<K,V> implementsMap.Entry<K,V> {
           finalint hash;
           finalK key;
           Vvalue;
           Node<K,V>next;

           publicfinal K getKey() {
               returnkey;
           }

           publicfinal V getValue() {
               returnvalue;
           }
       }

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

Map集合遍历的第二种方式:使用Entyset对象形式遍历
介绍一个对象 entry<k,v>里面有两个方法可以用entry.getkey  entry.get.value

Map集合中的方法:
    Set<Map.Entry<K,V>>entrySet() 返回此映射中包含的映射关系的 Set 视图。

实现步骤:
    1.使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中
    2.遍历Set集合,获取每一个Entry对象
    3.使用Entry对象中的方法getKey()和getValue()获取键与值
Map<String, String> map = newHashMap<>();
       //keySet()遍历
       Set<Map.Entry<String,String>> entries = map.entrySet();
       for(Map.Entry<String, String> entry : entries) {
           // 通过Entry对象获取每个键值对
           String value = entry.getKey();
           String value = entry.getValue();
           // 打印当前键值对
           System.out.println(key + "=" +value);
       }

l    HashMap存储自定义类型键值
Map集合保证key是唯一的:
    作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一
HashMap存储自定义JavaBean对象作为key保证key唯一不重复, 需要让JavaBean重写 hashCode() 和 equals() 方法



    java.util.LinkedHashMap<K,V>entends HashMap<K,V>
    Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。
    底层原理:
        哈希表+链表(记录元素的顺序)


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


l    JDK9的新特性:
List接口,Set接口,Map接口:里边增加了一个静态的方法of,可以给集合一次性添加多个元素
   static <E> List<E> of​(E... elements)
    使用前提:
        当集合中存储的元素的个数已经确定了,不在改变时使用
注意:
    1.of方法只适用于List接口,Set接口,Map接口,不适用于接接口的实现类
    2.of方法的返回值是一个不能改变的集合,集合不能再使用add,put方法添加元素,会抛出异常
    3.Set接口和Map接口在调用of方法的时候,不能有重复的元素,否则会抛出异常
使用集合添加大量元素时, 反复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() 方法的时候, 不能有重复的元素, 否则会抛出异常

l  使用of方法快速添加元素
使用List.of()方法, 添加1,2,3, 获取集合对象, 使用增强for遍历打印输出
使用Set.of()方法, 添加1,2,3, 获取集合对象, 使用增强for遍

l    调试程序Debug
断点:
       breakpoint,在debug模式下, 程序运行到断点会暂停住, 便于我们在程序运行过程中查看
Debug调试程序:
    可以让代码逐行执行,查看代码执行的过程,调试程序中出现的bug
使用方式:
    在行号的右边,鼠标左键单击,添加断点(每个方法的第一行,哪里有bug添加到哪里)
    右键,选择Debug执行程序
    程序就会停留在添加的第一个断点处
执行程序:
   f8:逐行执行程序
   f7:进入到方法中
   shift+f8:跳出方法
   f9:跳到下一个断点,如果没有下一个断点,那么就结束程序
   ctrl+f2:退出debug模式,停止程序
Console:切换到控制台
u 今日API
java.util.Map接口: 双列集合的顶层
       //成员方法
       V put(K key, V value):添加/修改 键值对.
           如果键存在, 则用新值替换已有值, 返回被替换的值; 如果键不存在, 则添加键值对, 返回null
       V remove(Object key):根据键删除键值对, 返回被删除元素的值
              如果键不存在, 返回null
       V get(Object key):根据键获取值.
           如果键不存在, 则返回null
       booleancontainsKey(Object key): 判断是否包含指定的键
       Set<K> keySet():获取Map集合中所有的键, 存储到Set集合中
       Set<Map.Entry<K,V>> entrySet():获取到Map集合中所有的键值对对象的集合(Set集合)

// JDK 9对于集合初始化的优化
java.util.List
       //静态方法
       staticList<E> of(E... e): 返回包含指定元素的 不可变List 集合

java.util.Set
       //静态方法
       staticSet<E> of(E... e): 返回包含指定元素的 不可变Set 集合

java.util.Map
       //静态方法
       staticMap<K, V> of(K k1, V v1): 返回包含指定键值对的 不可变Map 集合

uMap双列集合总结

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 个回复

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