【Java 数据结构】Map和Set的介绍
1、Map 和 Set 的概念
Java 提供了 Map 和 Set 的接口,是一种专门用来进行搜索的容器或数据结构,而他搜索的效率与其具体实例化的子类有关,比如 TreeMap 和 HashMap 的搜索效率就不一样。
如果利用学习到现在的知识,我们要去找一个元素,可能会采取遍历这样的方式,那么时间复杂度是 O(n),也可也采取二分查找,时间复杂度能达到 O(logn), 但必须要求数据是有序的。
如上所说的比较适合静态的查找,也就是一般不会对里面的元素进行插入和删除操作了。
那么假设我要根据学生的学号,找出对应的姓名,或者我要根据学生这样的一个对象,找出他对应的学校相关信息,再或者通讯录中,根据姓名,找出电话。
这些例子是生活中经常会碰到的,也就是在查找时,会更新里面的数据,比如这个学生退学了,就删除掉,即动态查找,那么上述遍历呀,二分查找呀,就不合适了,而 Map 和 Set 是一种适合动态查找的集合容器。
2、模型
通俗来讲,你去吃火锅,有俩宫格的,和单宫格的,甚至多宫格的,那么放在编程里,一般把需要搜索的数据称为关键字 key,和关键字对应的称为值 value,将它称为 Key-value 的键值对,所以模型会有两种:
Key-value 模型:
-
比如有个XX火锅vip客户表,上面对应每个vip客户来消费的次数,即 <vip客户,消费次数> 比如每个身份证所对应的人,即 <身份证,人>
纯 Key 模型:
通过两个模型例子来看啊,键值对,也就是说大部分是对应关系,而纯 key 模型,大部分在找是否存在这个key,具体我们后面再细说。
而 Map 存储就是 Key-value 的键值对,Set 只存储了 Key
3、Map 的学习
3.1 关于 Map.Entry<K,V>
Map.Entry<K,V> 是 Map 内部实现用的来存放 <key,value> 键值对的内部类,可以理解成我们之前模拟实现链表时候里面的 Node 节点,也是一个内部类。
这个内部类中,主要提供了 <key,value> 的获取方法和 value 的设置:
注意:Entry<K,V> 并没有提供 key 的设置,key 的值一定是唯一的,不能重复!
3.2 Map 的常用方法
4、Set 的常用方法
5、 Map 和 Set 的注意点
Set 的底层是 Map 来实现的, 讲到后续会体现出来。
Map 没有继承 Iterator 所以不能返回迭代器,而 Set 继承了 Iterator 可以采用迭代器遍历:
Map 并没有继承 Collection,里面的 key 不能重复,而 Set 虽然继承了 Collection 但是底层实现还是 Map 所以 Set 中的 key 也不能重复。
HashSet 的基础上维护了一个双向链表来记实现Set接口的常用类有 TreeSet 和 HashSet,还有一个LinkedHashSet,LinkedHashSet是在录元素的插入次序。
到这里先了解这么多,具体在后续的 TreeMap,TreeSet,HashMap,HashSet 会体现。