Map 和 Set

本文介绍了 Java 中的 Map 和 Set 数据结构。Map 使用 key-value 模型,其中 Key 是唯一的,不允许重复,而 Set 是纯 key 模型,用于去重。Map 的常用方法包括插入、删除和访问键值对,其底层结构可以是 HashMap 或 TreeMap。Set 则继承自 Collection,只存储不重复的 Key,实现类如 TreeSet 和 HashSet,它们的底层也是基于 Map 实现的。
摘要由CSDN通过智能技术生成

模型

一般我们把搜索的数据称为 关键字(key) , 关键字对应的值叫做 值(value) , 将之称为 key-value 键值对. 衍生出两种模型:

        1. 纯 key 模型

            例如 : 班级上点名, 在花名册上找人的名字.

        2. key-value 模型

            例如 : 统计一个字符串中每个字母出现的次数, 结果是每个字母和它对应所出现的次数

Map 就使用 key-value模型, Set 使用 纯key模型

Map 的使用

1.对于 Map 的说明

 Map是一个接口类,该类没有继承自Collection,该类中 存储 的是 <key, value>结构的键值对,并且Key一定是唯一 的,不能重复.

2. Map 的常用方法

方法解释
put (K key,V value)将 key - value 映射关系放入到 map 集合中(若存在,则替换)
get (Object k)返回 k 对应 value(若该键不存在,则返回 Null)
getOrDefault (K key,V defaultValue)返回 k 对应的 value(若该键不存在,则返回 defaultValue,但不会修改集合本身)
remove (K key)删除 key - value 映射关系(若存在则返回 value,否则返回 null,会修改集合)
Set< K > keySet()返回所有 key 的不重复集合
Collection< V > values()返回所有 value 的可重复集合
  1. Set< Map.Entry< K,V > > entrySet()
返回所有的 key-value 映射关系
boolean containsKey(Object key)判断是否包含 key
boolean containsValue(Object value)判断是否包含 value

注意:

  1. Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap

  2. Map中存放键值对的Key是唯一的,value是可以重复的

  3. 在Map中插入键值对时,key不能为空,否则就会抛NullPointerException异常,但是value可以为空 

  4. Map中的Key可以全部分离出来,存储到Set中来进行访问(因为Key不能重复)

  5. Map中的value可以全部分离出来,存储在Collection的任何一个子集合中(value可能有重复)

  6. Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进重新插入

3. Map的底层结构

Map 底层结构TreeMapHashMap
底层结构红黑树哈希桶
插入 / 删除 / 查找时间复杂度O(log2 N)O(1)
是否有序关于 Key 有序无序
线程安全不安全不安全
插入 / 删除 / 查找区别需要进行元素比较通过哈希函数计算哈希地址
比较 与 覆写key 必须能够比较,否则会抛出异常自定义类型需要覆写 equals 和 hashCode 方法
应用场景需要 Key 有序场景下Key 是否有序不关心,需要更高的时间性能

Set 的使用

1. 作用

去重,Set与Map主要的不同有两点:Set是继承自Collection的接口类,Set中只存储了Key.

遍历Set集合,直接使用for - each循环即可(只要是Iterable接口的子类,都可以直接使用for - each循环),在遍历Map集合时需要将Map转为Set - for(Map.entry<具体类型> entry : map.entrySet())

2. Set 的说明

Set与Map主要的不同有两点:Set是继承自Collection的接口类,Set中只存储了Key。

3. Set 常用方法

返回类型方法名说明
booleanadd(E e)若指定元素不存在,则将该元素添加
voidclear()清空集合
booleanisEmpty()判断集合是否为空
intsize()返回元素个数
booleanremove(Object o)删除指定元素
booleancontains(Object o)返回是否存在该元素
booleanretainAll(Collection<?> c)求 this 和 c 的交集
Iterator< E >iterator()返回迭代器
Object[]toArray()将 set 中的元素转换为数组返回

注意:

1、Set是继承自Collection的一个接口类
2、Set中 只存储了key,并且要求 key一定要唯一
3、Set的 底层 是使用 Map 来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中
4、Set最大的功能就是对 集合中的元素进行去重
5、实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础上维护了一个双向链表来记录元素的插入次序。
6、Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入
7、Set中 不能插入null的key。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

即将秃头的菜鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值