• 【第十一章 Map接口,HashMap底层实现原理】


    第十一章 Map接口,HashMap底层实现原理,Map中定义的方法,Collections工具类

    1.Map接口概述
    双列数据,存储key-value对的数据,类似于高中的函数:y=f(x)
    ①HashMap:作为Map的主要实现类,线程不安全的,效率高,存储null的key和value。
    LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序实现遍历。
    原因:在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素,对于频繁的遍历操作,此类操作执行效率高于HashMap。
    HashMap的底层:
    数组+链表 jdk7及之前 数组+链表+红黑树 jdk8
    ②TreeMap:保证按照添加的key-value对进行排序,实现排序遍历,此时考虑key的自然排序和定制排序,底层使用红黑树。
    ③HashTable:作为古老的实现类,线程安全的,效率低,不能存储null的key和value。
    Properties:常用来处理配置文件,key和value都是String类型。
    2.Map结构的理解
    ①Map中的key:无序的,不可重复的,使用Set存储所有的key。------>(key所在的类要重写equals()和hashCode() (以HashMap为例))
    ②Map中的value:无序的,可重复的,使用Collection存储所有的value。
    ③一个键值对:key-value构成了一个Entry对象。
    ④Map中的entry:无序的,不可重复的,使用Set存储所有的key。
    3.HashMap的底层实现原理

    1)以jdk7为例说明:
    HashMap map=new HashMap();
    实例化以后,底层创建了长度为16的一维数组Entry[] table。
    .....可能已经执行过多次put,
    map.put(key1,value1);
    首先,调用key1所在类的hashCode()计算key1哈希值,此哈希值经过某种算法计算以后,得到在Entry数组中的存放位置。
    如果此位置上数据为空,此时的key1-value1添加成功。---->情况1
    如果此位置上的数据不为空(意味着此位置上存在一个或多个数组(以链表形式存在)),比较key1和已经存在的一个或多个数据的哈希值:
       如果key1的哈希值与已经存在的数据的哈希值都不相同,此时的key1-value1添加成功。---->情况2
       如果key1的哈希值和已经存在的某一个数据(key1-value2)的哈希值相同,继续比较:调用key1所在类的equals()方法,比较:
            如果equals()返回false:此时的key1-value1添加成功   ----->情况3
            如果equals()返回true:使用value1替换value2。
    *补充:关于情况2和情况3:此时的key1-value1和原来的数据以链表的方式存储。
    在不断的添加过程中,会涉及到扩容问题,默认的扩容方式:扩容为原来的2倍,并将原有的数据复制过来。
    (2)jdk8相较于jdk7在底层实现方面的不同:
    ①new HashMap():底层没有创建一个长度为16的数组。
    ②jdk8底层的数据是:Node[],而非Entry[]。
    ③首次调用put()方法时,底层创建长度为16的数组。
    ④jdk7底层的结构只有:数组+链表。jdk8中底层结构:数组+链表+红黑树
    当数组的某一个索引位置上的元素以链表形式存储的数据个数>8且当前数组的长度>64时,此时的索引位置上的索引数据改为使用红黑树存储。
    

    4.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集合
        /**
             * * ①添加、删除、修改操作:
             * 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中的所有数据
             */
        @Test
        public  void test(){
            Map map=new HashMap();
            //添加
            map.put("AA",123);
            map.put(45,123);
            map.put("BB",56);
            //修改
            map.put("AA",87);
            System.out.println(map);//{AA=87, BB=56, 45=123}
            //putAll()
            Map map1=new HashMap();
            map1.put("CC",56);
            map1.put("DD",123);
            map.putAll(map1);
            System.out.println(map);//{AA=87, BB=56, CC=56, DD=123, 45=123}
            //remove
            Object obj=map.remove("CC");
            System.out.println(obj);//56
            System.out.println(map);//{AA=87, BB=56, DD=123, 45=123}
            map.clear();//与map=null不同
            System.out.println(map.size());//0
            System.out.println(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是否相等
             */
      @Test
        public void test1(){
            Map map=new HashMap();
            map.put("AA",123);
            map.put(45,123);
            map.put("BB",56);
            //Object get(Object key)
            System.out.println(map.get(45));//123
            //boolean containsKey(Object key)
            boolean key = map.containsKey("BB");
            System.out.println(key);//true
            //boolean containsValue(Object value)
            boolean value = map.containsValue(123);
            System.out.println(value);//true
            //boolean isEmpty()
            boolean empty = map.isEmpty();
            System.out.println(empty);//false
        }
    
       /**
             * ③元视图操作的方法:
             *Set keySet():返回所有key构成的Set集合
             *Collection values():返回所有value构成的Collection集合
             *Set entrySet():返回所有key-value对构成的Set集合
             */
       @Test
        public void test2(){
            Map map=new HashMap();
            map.put("AA",123);
            map.put(45,1234);
            map.put("BB",56);
            //遍历所有的key集:keySet()
            Set set = map.keySet();
            Iterator iterator=set.iterator();
            while (iterator.hasNext()){
                System.out.println(iterator.next());
            }
            System.out.println();
            //遍历所有的values集:values()
            Collection values = map.values();
            for (Object object:values){
                System.out.println(object);
            }
            //遍历所有的key-value:entrySet()
            Set set1 = map.entrySet();
            Iterator iterator1=set1.iterator();
            while (iterator1.hasNext()){
                Object obj=iterator1.next();
                //entrySet集合中的所有元素都是entry
                Map.Entry entry=(Map.Entry)obj;
          System.out.println(entry.getKey()+"------>"+entry.getValue());
            }
        }
    

    5.Collections工具类
    ①Collections 是一个操作 Set、List 和 Map 等集合的工具类。
    ② 面试题:Collection和Collections的区别?
    Collection:操作单列数据的接口;
    Collections:操作Collection的工具类。

    排序操作:(均为static方法)
    /**reverse(List):反转 List 中元素的顺序
     * shuffle(List):对 List 集合元素进行随机排序
     * sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序
     * sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
     * swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换
     * 查找、替换
     * Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
     * Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
     * Object min(Collection)
     * Object min(Collection,Comparator)
     * int frequency(Collection,Object):返回指定集合中指定元素的出现次数
     * void copy(List dest,List src):将src中的内容复制到dest中
     * boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换List 对象的所有旧值
     */
    	 @Test
        public  void  test(){
            List list=new ArrayList();
            list.add(123);
            list.add(45);
            list.add(-56);
            list.add(123);
            list.add(0);
            System.out.println(list);
            Collections.reverse(list);
            System.out.println(list);
            Collections.shuffle(list);
            System.out.println(list);
            List dest= Arrays.asList(new Object[list.size()]);
            Collections.copy(dest,list);
            System.out.println(dest);
        }
    
  • 相关阅读:
    【C++】C++11------线程库
    推荐免费的文本转语音工具TTS-Vue【且开源】
    微软的这个按钮又双叒叕变了位置?有时候还不见了……
    算法系列十:十大经典排序算法之——堆排序
    php实战案例记录(11)unset函数的用法
    Python实现PU口袋活动更新提醒
    华新集团再冲刺港交所上市:上半年收入2.6亿元,张德红为董事长
    pve关闭windows虚拟机慢
    python基础 - 将子列表相同位置的元素重组
    什么是CI/CD:持续集成与持续交付?(InsCode AI 创作助手)
  • 原文地址:https://blog.csdn.net/qq_43742813/article/details/127044673