Java基础-Map集合系列

本文深入解析了Map集合的特点及其常用方法,对比了HashMap、TreeMap和Hashtable的底层数据结构与应用场景,同时介绍了三种Map集合的遍历方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1- Map集合特点

2- Map接口的常用方法

3- HashMap集合

4- TreeMap集合

5- Hashtable集合

6- Map集合遍历的三种方式

Map集合特点

Map接口没有继承其他接口,和Collection单列接口不同,Map是双列的,并且以键值对的形式存储;

存储时元素的键(Key)不可重复,并且可以使用null值(Value)做为键。

Map的数据结构只对键(Key)生效,与值(Value)无关。

Map接口的常用方法

向集合中添加元素
// 如果Map中不存在这个Key,则返回null
// 如果Map中已经存在这个Key,则返回这个Key对应的Value,并设置这个Key对应的Value为最新值
map.put(K key,V value)

根据键删除集合中的元素
// 根据键删除集合中的元素
map.remove(Object key)

根据键(Key)获取Value
map.get(Object key)

判断集合是否包含指定键
// 返回Boolean值
map.containsKey(Object key)

清空集合
map.clear()

获取集合的长度
// 返回一个int类型值
map.size()


HashMap

image.png

Map集合框架中HashMap可以说是最常用的,从上图HashMap继承图中可以看到,它实现了三个接口,继承了一个抽象类。SerializableCloneable都是标识接口,他们的作用可以查看上一篇内容。AbstractMap抽象类则是Map子类的共性方法抽取,以避免代码重复。

HashMap不是线程安全的,如果对线程安全有要求的话建议使用concurrent包下的ConcurrentHashMap集合。

HashMap底层数据结构

JDK1.8之前是数组+链表的数据结构

JDK1.8之后则有增加了红黑树的数据结构,变成了数组+链表+红黑树

详细数据结构内容请参考这篇内容:https://mp.weixin.qq.com/s/8q032Yt5LMtFmraBb-9Z6A


TreeMap

image.png

在Map集合框架中,除了HashMap以外,TreeMap也是常用到的集合对象之一。

TreeMap底层数据结构

相较HashMap,TreeMap底层使用红黑树的结构,而HashMap在达到一定条件后才会转为红黑树的结构。

TreeMap继承关系

TreeMap实现的接口中CloneableSerializable都是标识性接口,前者标识TreeMap可以被克隆,后者标识TreeMap可被序列化。实现的NavigableMap接口意味着TreeMap拥有相较HashMap更强的元素搜索能力。实现的AbstractMap抽象类作用与HashMap无异,都是避免代码重复而做的共性抽取。

需要注意的是,TreeMap在存储NULL键时会出现空指针异常,这是因为存入数据的时候,put方法调用了String类的compareTo方法,导致了空指针的异常。如果需要存储NULL键,则需要我们自定义Comparator比较器,让它强制存储NULL键。

Hashtable

image.png

注意Hashtable没有使用驼峰命名,t为小写而非大写。

Hashtable的操作几乎与HashMap一致,主要区别在于Hashtable是线程安全。另外Hashtable的键和值都不接受NULL,会返回空指针异常。由于Oracle官方预计将其废弃,所以不建议使用Hashtable,如果对线程安全要求比较高,推荐使用concurrent包下的ConcurrentHashMap,这里就不做更多描述。

Map集合遍历

这里介绍三种常用方法:

第一种方法:使用ForEach方式遍历

利用entrySet方法返回一个Entry的Set集合,而Set集合是单列集合,我们可以遍历这个Set集合来做到遍历整个Map集合。

for(Map.Entry<String,Object> entry:map.entrySet()){
    System.out.println(entry.getKey()+"--"+entry.getValue());
}

第二种方法:使用迭代器遍历

Set集合可以获取一个迭代器,执行这个迭代器则可以遍历整个Map集合。

Iterator iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
    Map.Entry next = (Map.Entry)iterator.next();
    System.out.println(next.getKey()+"--"+next.getValue());
}

第三种方法:使用Lambda表达式遍历

这种方式是最简单的方式,由Map接口提供的方法,而这个方法的底层还是使用ForEach来进行遍历元素。

map.forEach((k,v)->{
    System.out.println(k+"--"+v);
});

关注公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值