【Java 数据结构】Map和Set的介绍

03-07 1192阅读

【Java 数据结构】Map和Set的介绍


目录

1、Map 和 Set 的概念

2、模型

3、Map 的学习

3.1 关于 Map.Entry

3.2 Map 的常用方法

4、Set 的常用方法 

5、 Map 和 Set 的注意点


1、Map 和 Set 的概念

Java 提供了 Map 和 Set 的接口,是一种专门用来进行搜索的容器或数据结构,而他搜索的效率与其具体实例化的子类有关,比如 TreeMap 和 HashMap 的搜索效率就不一样。

如果利用学习到现在的知识,我们要去找一个元素,可能会采取遍历这样的方式,那么时间复杂度是 O(n),也可也采取二分查找,时间复杂度能达到 O(logn), 但必须要求数据是有序的。

如上所说的比较适合静态的查找,也就是一般不会对里面的元素进行插入和删除操作了。

那么假设我要根据学生的学号,找出对应的姓名,或者我要根据学生这样的一个对象,找出他对应的学校相关信息,再或者通讯录中,根据姓名,找出电话。

这些例子是生活中经常会碰到的,也就是在查找时,会更新里面的数据,比如这个学生退学了,就删除掉,即动态查找,那么上述遍历呀,二分查找呀,就不合适了,而 Map 和 Set 是一种适合动态查找的集合容器。

【Java 数据结构】Map和Set的介绍

2、模型

通俗来讲,你去吃火锅,有俩宫格的,和单宫格的,甚至多宫格的,那么放在编程里,一般把需要搜索的数据称为关键字 key,和关键字对应的称为值 value,将它称为 Key-value 的键值对,所以模型会有两种:

Key-value 模型:

  • 比如有个XX火锅vip客户表,上面对应每个vip客户来消费的次数,即
  • 比如每个身份证所对应的人,即

    纯 Key 模型:

    • 比如老师上网课,会议中出现了一个叫 篮球哥 的人,于是让班长看下这个班级中有没有篮球哥这个人。
    • 比如当你情敌发了个动态,你会看看你女神有没有给他点赞。

      通过两个模型例子来看啊,键值对,也就是说大部分是对应关系,而纯 key 模型,大部分在找是否存在这个key,具体我们后面再细说。

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


      3、Map 的学习

      3.1 关于 Map.Entry

      Map.Entry 是 Map 内部实现用的来存放 键值对的内部类,可以理解成我们之前模拟实现链表时候里面的 Node 节点,也是一个内部类。

      这个内部类中,主要提供了 的获取方法和 value 的设置:

      方法解释
      K getKey()返回当前 Entry  对象中的 key
      V getValue()返回当前 Entry  对象中的 value
      V setValue(V value)将键值对中的 value 进行替换指定的 value

      注意:Entry 并没有提供 key 的设置,key 的值一定是唯一的,不能重复!

      3.2 Map 的常用方法

      方法解释
      V get(Object key)返回 key 对应的 value
      V getOrDefault(Object key, V defaultValue)返回 key 对应的 value,key 不存在,返回默认值
      V put(K key, V value)设置 key 对应的 value
      V remove(Object key)删除 key 对应的映射关系
      Set keySet()返回所有 key 的不重复集合
      Collection values()返回所有 value 的可重复集合
      Set> entrySet()返回所有的 key-value 映射关系
      boolean containsKey(Object key)判断是否包含 key
      boolean containsValue(Object value)判断是否包含 value

      4、Set 的常用方法 

      方法解释
      boolean add(E e)添加元素,但重复元素不会被添加成功
      void clear()清空集合
      boolean contains(Object o)判断 o 是否在集合中
      Iterator iterator()返回迭代器
      boolean remove(Object o)删除集合中的 o
      int size()返回set中元素的个数
      boolean isEmpty()检测set是否为空,空返回true,否则返回false
      Object[] toArray()将set中的元素转换为数组返回
      boolean containsAll(Collection c)集合c中的元素是否在set中全部存在,是返回true,否则返回 false
      boolean addAll(Collection c)将集合c中的元素添加到set中,可以达到去重的效果

      5、 Map 和 Set 的注意点

      Set 的底层是 Map 来实现的, 讲到后续会体现出来。

      Map 没有继承 Iterator 所以不能返回迭代器,而 Set 继承了 Iterator 可以采用迭代器遍历:

      【Java 数据结构】Map和Set的介绍

      Map 并没有继承 Collection,里面的 key 不能重复,而 Set 虽然继承了 Collection 但是底层实现还是 Map 所以 Set 中的 key 也不能重复。

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

      到这里先了解这么多,具体在后续的 TreeMap,TreeSet,HashMap,HashSet 会体现。


      下期预告:【Java 数据结构】TreeMap 和 TreeSet

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]