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));
}

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

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

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

map1.putAll(map);

如果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时在括号中给定比较器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值