zoukankan      html  css  js  c++  java
  • 集合---Map

    Map对应python中的字典  存储键值对 

    1: Map与Collection并列存在。用于保存具有映射关系的数据:key-value
    
    2: Map 中的 key 和 value 都可以是任何引用类型的数据 
    
    3:  Map 中的 key 用Set来存放,不允许重复,即同一个 Map 对象所对应 的类,须重写hashCode()和equals()方法 
    
    4:  常用String类作为Map的“键”
    
    5:  key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到 唯一的、确定的 value
    
    6:  Map接口的常用实现类:HashMap、TreeMap、LinkedHashMap和 Properties。其中,HashMap是 Map 接口使用频率最高的实现类

    HashMap:

    HashMap是 Map 接口使用频率最高的实现类。 
    
    允许使用null键和null值,与HashSet一样,不保证映射的顺序。 
    
    所有的key构成的集合是Set:无序的、不可重复的。所以,key所在的类要重写: equals()和hashCode() 
    
    所有的value构成的集合是Collection:无序的、可以重复的。所以,value所在的类 要重写:equals() 
    
    一个key-value构成一个entry 所有的entry构成的集合是Set:无序的、不可重复的 HashMap 判断两个 key 相等的标准是:两个 key 通过 equals() 方法返回 true, hashCode 值也相等。
    
    HashMap 判断两个 value相等的标准是:两个 value 通过 equals() 方法返回 true
     *   |---- Map 双列数据,存储key--value
     *          |---- HashMap: 作为Map的主要实现类
     *              |---- LinkedHashMap:保证在遍历map元素时,可以按照添加顺序实现遍历。
     *                                   原因: 在原有的HaspMap底层结构基础上,添加一对指针,分别指向前一个后一个元素
     *                                    对于频繁遍历的元素操作,此类执行效率高于HaspMap
     *          |---- TreeMap: 可以按照添加的key--value来进行排序,实现排序(此时考虑key来排序)
     *          |---- Hashtable: 古老的实现类,线程安全的效率低  不能存储null的key和value
     *
     *
     *   HashMap的底层:数组+链表(jdk7之前)
     *                 数据+链表+红黑树(jdk8)

     

    HashMap的底层实现原理:

    *   Jdk7 :
     *   HashMap hashMap = new HashMap();
     *    在实例化之后 底层创建了长度为16的一维数组 Entry [] table(因为key和value组成了以一个entry的对象)
     *    ....可能执行了多次put...
     *    map.put(key1,value1);
     *    首先调用key1所在类的hashcode()计算key1的哈希值,此哈希值经过某种算法计算以后,得到在Entry数组存放的位置
     *    如果此位置上的数据为空,那么key1--value1添加成功        ------情况1
     *    如果此位置上的数据不为空(意味着此位置上存在一个或者多个以链表形式存在的数据),那么比较key1和已经存在的一个或多个数据的哈希:
     *              如果key1的哈希值与已经存在的数据的哈希值都不相同,此时key1--value1添加成功             ----- 情况2
     *              如果key1的哈希值和已经存在的某一个数据(key2---value2)的哈希值相同,继续比较  调用key1所在类的equals(key2)
     *              进行比较:
     *                      如果equals()返回false:此时key1--value1添加成功              ------》情况3
     *                      如果equals()返回true:此时就是替换了 将value1替换相同key的value值(key相同 ,而值不同的替换行为)
     *
     *
     *     关于情况2 和情况3:此时key1---value1和原来数据的存储方式是以链表的形式存储
     *
     *     在不断添加内容的过程中是,会涉及到扩容的问题,默认的扩容方式 扩容为原来容量的二倍 并且将原来的数据复制到扩容后的容量中
     *
     *
     * Jdk8与Jdk7不同的点:
     *  1new HashMap()的时候不会创建一个长度为16的数组
     *
     *  2: Jdk8底层的数组是:Node[]而不是Entry[]
     *
     *  3: 首次调用put()时,方才创建底层长度为16的数组
     *
     *  4: jdk7的底层结构只有:数组+链表,jdk8底层结构:数组+链表+红黑树
     *      当一个数组的某一个索引位置上的元素以链表形式存在的个数 > 8且数组的长度 > 64时,
     *      此时索引位置上的所有元素改为红黑树存储
     *
     *      为何要用红黑树?
     *       比如二叉树存储,时有序的  例如小的全部方左边或者右边 那么依次这样排放,查找也方便
     *
     *
     *
     *
     *
     *   HashMap和Hashtable的异同
     *
     *
     *
     *   Map结构的理解
     *
     *     Map中的key是无序的,不可重复的,使用Set存储所有的key  --- 如果key是自定义的类,key所在的类要重写hashcode()和equals()方法
     *     Map中的value是无序的,不可重复的,使用Collection存储所有的value ---- value所在的类重写equals()
     *     一个键值对key--value构成一个Entry对象
     *     Map中的Entry对象无序的,不可重复的,使用Set存储所有的entry对象
     *

    Jdk7:

    Jdk8:

     

    Map接口的常用方法

     添加、删除、修改操作: 
         Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中 
         void putAll(Map m):将m中的所有key-value对存放到当前map中 
         Object remove(Object key):移除指定key的key-value对,并返回value 
         void clear():清空当前map中的所有数据 
    
    
     元素查询的操作: 
         Object get(Object key):获取指定key对应的value 
         boolean containsKey(Object key):是否包含指定的key 
         boolean containsValue(Object value):是否包含指定的value 
         int size():返回map中key-value对的个数 
         boolean isEmpty():判断当前map是否为空 
         boolean equals(Object obj):判断当前map和参数对象obj是否相等 
    
    
      元视图操作的方法: 
         Set keySet():返回所有key构成的Set集合     
         Collection values():返回所有value构成的Collection集合 
         Set entrySet():返回所有key-value对构成的Set集合

    put(key, value)添加元素或者修改元素

    HashMap hashMap = new HashMap();
            hashMap.put(1,23);
            hashMap.put(2,"老张");
            hashMap.put(3,"老刘");

    修改;当key存在时在添加相同的key的键值对就是修改value

    hashMap.put(3,"老刘");



    hashMap.put(3,"您好"); // 修改操作
    
    

    keySet(); 获取Map中所有的key构成的Set集合

            Set set= hashMap.keySet(); // 获取所有key的set集合
            Iterator iterator = set.iterator();   // 转化成迭代器取值
            while (iterator.hasNext()){
                System.out.println(iterator.next());
            }

    values(); 获取Map中所有的value构成的Collection集合

            Collection collection = hashMap.values();  // 获取所有的value构成的Collection
            Iterator iteratorOne = collection.iterator();
            while (iteratorOne.hasNext()){
                System.out.println(iteratorOne.next());
            }

    entrySet(); 获取map中的所有的键值对构成的Set集合

            Set setOne = hashMap.entrySet();
            Iterator iteratorTwo = setOne.iterator();
            while (iteratorTwo.hasNext()){
                System.out.println(iteratorTwo.next());  
                //2=老张
                //3=您好
            }



    Set setOne = hashMap.entrySet();
    Iterator iteratorTwo = setOne.iterator();
    while (iteratorTwo.hasNext()){
    Object obj = iteratorTwo.next();
    // EntrySet集合中的元素都是entry
    Map.Entry entry = (Map.Entry)obj;
    System.out.println(entry.getKey()+"---->"+entry.getValue()); // 取出entry的key和value
    }
            HashMap hashMap = new HashMap();
            HashMap hashMapOne =  new HashMap();
            hashMap.put(1,"老王");
            hashMap.put(2,"老张");
            hashMapOne.put(4,"隔壁小姐姐");
            hashMapOne.put(6,"老张在隔壁");
            System.out.println(hashMap.containsKey(1));
            System.out.println(hashMap.get(2));
            hashMap.remove(1);
            hashMap.putAll(hashMapOne); // 另一个hashMapOne集合添加到此hashMap集合
            System.out.println(hashMapOne.isEmpty()); // 判断是否为空
            hashMapOne.clear();
            System.out.println(hashMap.size());
            Set set = hashMap.keySet();  // 获取所有的key
            Collection list = hashMap.values(); // 获取所有的values
            Set setOne = hashMap.entrySet(); // 获取所有的entry
  • 相关阅读:
    css页面自适应 媒体查询
    微信小程序rich-text中的nodes属性
    解析base64数据流---加载pdf
    用伪元素完成箭头
    搭建vue --2.x
    搭建Vue项目 vue-cli vue1.x
    Chrome----TCP
    单进程VS多进程
    线程VS进程
    Chrome---network模块---Timing
  • 原文地址:https://www.cnblogs.com/zhaoyunlong/p/13026472.html
Copyright © 2011-2022 走看看