Java集合利器 Map & Set

简介: Java集合利器 Map & Set

一、概念

MapSet是一种专门用来进行搜索的数据结构,其搜索的效率与其具体的实例化子类有关。它们分别定义了两种不同的数据结构和特点:

  1. Map(映射) :Map是一种键值对(key-value)的集合,每个键值对都是一个元素。
  2. Set(集合):Set是一种不允许重复元素(key)的集合。

通过查看Java集合框架图,可以看到,Set 接口有两个实现类:TreeSet 类和 HashSet 类Map 接口有两个实现类:TreeMap 和 HashMap

二、Map

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

Map常用方法

方法 描述
V get(Object key) 返回键对应的值
V getOrDefault(Object key, V defaultValue) 返回键对应的值,如果键不存在则返回默认值
V put(K key, V value) 设置键对应的值
V remove(Object key) 删除键及其对应的映射关系
int size() 返回Map中键值对的数量
Set keySet() 返回所有键的不重复集合
Collection values() 返回所有值的可重复集合
Set<Map.Entry<K, V>> entrySet() 返回所有键-值映射关系的集合
boolean containsKey(Object key) 判断是否包含指定键
boolean containsValue(Object value) 判断是否包含指定值

在上面的Map方法中,entrySet()方法返回值中出现了一个特殊的类型 Map.Entry<K, V>,它是Map内部实现的用来存放<key, value>键值对映射关系的内部接口,该内部接口中主要提供了key、 value 的获取,以及value的设置等方法:

方法 描述
K getKey() 返回 entry 中的键
V getValue() 返回 entry 中的值
V setValue(V value) 将键值对中的值替换为指定的值

注意:

  1. Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap,还有一个LinkedHashMap,LinkedHashMap是在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删除掉,然后再来进行
    重新插入。

TreeMap和HashMap的区别

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

三、Set

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

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<? extends E> c) 将集合 c 中的元素添加到 set 中,可以达到去重的效果

注意:

  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可以。

TreeSet和HashSet的区别

Set底层结构 TreeSet HashSet
底层结构 红黑树 哈希桶
插入/删除/查找时间复杂度 O(log N) O(1)
是否有序 关于Key有序 不一定有序
线程安全性 不安全 不安全
插入/删除/查找区别 按照红黑树的特性来进行插入和删除 先计算key哈希地址,然后进行插入和删除
比较与覆写 key必须能够比较,否则会抛出ClassCastException异常; 自定义类型需要覆写equals和hashCode方法
应用场景 需要Key有序场景下 Key是否有序不关心,需要更高的时间性能

下期预告

上述提到了HashMap 和 HashSet,它们底层都使用到了哈希表结构,关于 哈希表,我们下一章节介绍!

相关文章
|
2天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
2天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
2天前
|
Java 开发者
|
1天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
6 0
|
5月前
|
Dart
Dart之集合详解(List、Set、Map)
Dart之集合详解(List、Set、Map)
|
2月前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
2月前
|
存储 前端开发 API
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
该文章详细介绍了ES6中Set和Map数据结构的特性和使用方法,并探讨了它们在前端开发中的具体应用,包括如何利用这些数据结构来解决常见的编程问题。
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
|
1月前
|
存储 分布式计算 Java
Stream很好,Map很酷,但答应我别用toMap():Java开发中的高效集合操作
在Java的世界里,Stream API和Map集合无疑是两大强大的工具,它们极大地简化了数据处理和集合操作的复杂度。然而,在享受这些便利的同时,我们也应当警惕一些潜在的陷阱,尤其是当Stream与Map结合使用时。本文将深入探讨Stream与Map的优雅用法,并特别指出在使用toMap()方法时需要注意的问题,旨在帮助大家在工作中更高效、更安全地使用这些技术。
35 0
|
3月前
|
存储 安全 Java
java集合框架复习----(4)Map、List、set
这篇文章是Java集合框架的复习总结,重点介绍了Map集合的特点和HashMap的使用,以及Collections工具类的使用示例,同时回顾了List、Set和Map集合的概念和特点,以及Collection工具类的作用。
java集合框架复习----(4)Map、List、set
|
3月前
|
Java
【Java集合类面试二十二】、Map和Set有什么区别?
该CSDN博客文章讨论了Map和Set的区别,但提供的内容摘要并未直接解释这两种集合类型的差异。通常,Map是一种键值对集合,提供通过键快速检索值的能力,而Set是一个不允许重复元素的集合。