数据结构(十三)——Map和Set

1.搜索

1.1 概念及场景

Map set 是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对.
以前常见的 搜索方式有:
1. 直接遍历,时间复杂度为 O(N) ,元素如果比较多效率会非常慢
2. 二分查找,时间复杂度为
, 但搜索前必须要求序列是有序的
上述排序比较适合静态类型的查找,即一般不会对区间进行插入和删除操作了,而现实中的查找比如:
1. 根据姓名查询考试成绩
2. 通讯录,即根据姓名查询联系方式
3. 不重复集合,即需要先搜索关键字是否已经在集合中
可能在查找时进行一些插入和删除的操作,即动态查找,那上述两种方式就不太适合了,本节介绍的 Map Set 是 一种适合动态查找的集合容器。

1.2 模型

模型会有两种: 

而Map中存储的就是key-value的键值对,Set中只存储了Key。

两类集合的适用场景

  • Set集合:适用于需要保持元素独特性且无需特定顺序的情况。例如,存储一组唯一的用户名、IP地址等。
  • Map集合:适用于需要根据键来检索值的情况。例如,存储用户的信息、配置参数等。

2.Map

Map是Java集合框架中的另一种,它存储了一组键值对(Key-Value Pair)。每个键映射到一个值,使得通过键可以高效地检索对应的值。Map接口有多个实现类,

如HashMap、LinkedHashMap和TreeMap。

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

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

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

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

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

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

HashMap:高效查找

HashMap基于散列值的原理,通过散列函数将键映射到数组中的位置。这使得通过键快速查找对应的值成为可能。HashMap的特点是无序的,但是在JDK 8之后,它引入了红黑树来优化散列碰撞的情况,从而提升性能。

Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("apple", 1);
hashMap.put("banana", 2);
hashMap.put("orange", 3);
LinkedHashMap:保持插入顺序

LinkedHashMap在HashMap的基础上加入了保持插入顺序的特性,它通过链表维护元素的插入顺序。因此,当您需要在遍历Map时按照插入顺序进行操作,可以选择使用LinkedHashMap。

Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("apple", 1);
linkedHashMap.put("banana", 2);
linkedHashMap.put("orange", 3);
TreeMap:有序映射

TreeMap基于红黑树实现,可以实现键的自然排序。TreeMap要求键实现Comparable接口,从而能够对键进行排序。因此,当您需要按照键的顺序进行操作时,可以选择使用TreeMap。

Map<String, Integer> treeMap = new TreeMap<>();
treeMap.put("apple", 1);
treeMap.put("banana", 2);
treeMap.put("orange", 3);

3.Set 

独特性和无序性(Set中的元素不会重复,且没有特定的顺序。)

Set接口有多个实现类,如HashSet、LinkedHashSet和TreeSet。

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

 

1. Set是继承自Collection的一个接口类

2. Set中只存储了key,并且要求key一定要唯一

3. TreeSet的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的

4. Set最大的功能就是对集合中的元素进行去重

5. 实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础 上维护了一个双向链表来记录元素的插入次序。

6. Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入

7. TreeSet中不能插入null的key,HashSet可以。

HashSet:快速查找

HashSet基于散列值(hash code)的概念,能够快速查找元素。HashSet使用了HashMap来存储元素,其中元素被视为HashMap中的键。HashSet的特点是无序且独特,内部使用散列表实现

Set<String> hashSet = new HashSet<>();
hashSet.add("apple");
hashSet.add("banana");
hashSet.add("orange");
LinkedHashSet:保持插入顺序

LinkedHashSet在HashSet的基础上加入了保持插入顺序的特性,它通过链表维护元素的顺序。因此,当您希望元素保持添加的顺序,同时又要保持独特性,可以考虑使用LinkedHashSet。

Set<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("apple");
linkedHashSet.add("banana");
linkedHashSet.add("orange");
TreeSet:自然排序

TreeSet是基于红黑树(Red-Black Tree)实现的Set集合,它可以实现元素的自然排序。TreeSet要求元素实现Comparable接口,以便进行排序比较。

Set<String> treeSet = new TreeSet<>();
treeSet.add("apple");
treeSet.add("banana");
treeSet.add("orange");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值