• Java中的容器(二) 双例集合


    容器(二) 双例集合

    1、Map接口介绍

    image-20221029103034382

    Map中不能包含重复的Key,但可以包含重复的Value。

    Map中的常用方法

    image-20221029111300554

    put方法:key不存在时返回空,key存在时更新value,并返回旧的value。

    2、HashMap容器类

    image-20221107185126901

    通过KeySet获取元素

    Set<String> set = map.keySet();
    for (String s:set){
        System.out.println(s+" "+map.get(s));
    }
    
    • 1
    • 2
    • 3
    • 4

    通过entrySet方法获取Map.Entry类型获取元素

    Set<Map.Entry<String,String>> set1 = map.entrySet();
            for (Map.Entry<String,String> ss:set1){
                System.out.println(ss);
            }
    
    • 1
    • 2
    • 3
    • 4

    Map容器的并集操作(两个Map泛型要相同)

    map1.putAll(map);
    
    • 1

    如果Key相同,map中的Value会覆盖map1中的Value

    3 HashMap的底层源码分析

    HashMap底层采用的是Hash表,Hasp表的本质是“数组+链表”。

    image-20221107193104780

    jdk1.7中使用纯链表

    jdk1.8中

    链表的节点大于8时,转换为红黑树

    红黑树的节点小于6时,转换为链表

    成员变量

    image-20221107193817257

    数组的默认长度为16。

    image-20221107193843300

    数组的长度最大值为2^30

    image-20221107193915000

    数组扩容的负载因子为0.75,当数组容量使用超过75%,就要去扩容。

    image-20221107194033328

    链表长度大于8时转为红黑树

    image-20221107194107232

    红黑树树的节点小于6时,转为链表

    image-20221107194135237

    数组长度大于等于64时,才对长度大于8的链表转为红黑树

    image-20221107194226707

    记录Map中键值对的数量

    image-20221107194253127

    HashMap中的数组,节点类型为Node

    HashMap中存储元素的节点类型

    链表节点:

    image-20221107194848592

    红黑树节点:

    image-20221107195005673

    TreeNode继承Node

    image-20221107200225533

    数组初始化

    image-20221107200301996

    计算Hash值

    image-20221107202258487

    image-20221107202040142

    image-20221107202227662

    image-20221107202238200

    先将hashcode和hashcode右移16位的数异或,结果返回hashcode

    再将hashcode与数组长度-1想与。

    元素添加

    数组扩容

    二倍扩容

    TreeMap容器类

    image-20221107205510955

    Key要实现比较规则。

    使用方式与TreeMap一样,既可以在定义类中实现comparable接口中的comparTo类,也可以自定义比较器(实现Comparator接口中的compare方法)去比较。

    自定义比较器去比较时,初始化TreeMap时在括号中给定比较器

  • 相关阅读:
    CrossOver22试用期到了如何免费使用?
    餐饮智能化:餐饮机器人正当时餐饮机器人的喜与忧
    Nginx 实战教程
    二叉树的中序遍历
    什么是网络安全?如何让普通人简单的了解网络安全
    【开篇】汇编语言之基础知识篇
    iOS开发Swift-12-列表UI,TableViewController,动态响应Button勾选-待办事项App(1)
    公共WiFi有风险,使用请注意。
    K8S 中 kubectl 命令
    算法——动态规划
  • 原文地址:https://blog.csdn.net/qq_19830591/article/details/127740318