在 Java 编程中,Map 和 Set 是两个非常常用的数据结构。Map 提供了一种键值对的映射关系,使我们可以根据键来快速访问和操作对应的值。它的灵活性和高效性使得 Map 在各种场景中都得到了广泛的应用,比如存储配置信息、缓存数据等等。
而Set则是一种不重复元素的集合,它通过哈希表来存储元素,保证了快速的插入和查询操作。使用 Set 的好处是可以轻松地去除重复元素,同时还能进行集合之间的交、并、差等操作,非常适合处理需要保持唯一性的数据。
本篇博客将深入探讨 Java 中的 Map 和 Set,包括它们的基本概念、常见的实现类、常用操作以及适用场景。通过学习 Map 和 Set 的使用技巧,你将能够更加高效地处理和管理数据,提升你的 Java 编程技能。
一、Map
1.1、Map的介绍
map是一种特殊的集合,想要了解map就要先了解什么是二叉搜索树,不懂的二叉搜索树的好兄弟们可以看我之前的博文《二叉搜索树(Java语言实现)》,map的底层就是二叉搜索树,左边排小,右边排大,但是,map还可以插入一个 value, 也就是说 map 可以插入两个变量,但是排序的话还是按照前面的 key 排序。
1.2、Map的常用方法
方法 |
解释 |
V put(K key, V value) |
设置 key 对应的 value |
V get(Object key) |
返回 key 对应的 value |
V getOrDefault(Object key, V defaultValue) |
返回 key 对应的 value,key 不存在,返回默认值 |
V remove(Object key) |
删除 key 对应的映射关系 |
Set<K> keySet() |
返回所有 key 的不重复集合 |
Collection<V> values() |
返回所有 value 的可重复集合 |
Set<Map.Entry<K, V>> entrySet() |
返回所有的 key-value 映射关系 |
boolean containsKey(Object key) |
判断是否包含 key |
boolean containsValue(Object value) |
判断是否包含 value |
下面是每种方法的演示实现:
1)、put
代码实现如下:
public static void main(String[] args) {
Map<String, Integer> map = new TreeMap<>();
map.put("张三", 1);
map.put("李四", 1);
map.put("王五", 1);
map.put("赵六", 1);
}
这样就在 map 中插好了四个数据,如下:
2)、get
这个方法是返回 K 所对应的 V ,如果不存在,则返回 NULL 。代码实现如下:
public static void main(String[] args) {
Map<String, Integer> map = new TreeMap<>();
map.put("张三", 1);
map.put("李四", 1);
map.put("王五", 1);
map.put("赵六", 1);
System.out.println(map.get("王五"));
System.out.println(map.get("王"));
}
结果如下:
4)、getOrDefault
这个方法也是返回 K 所对应的 V,但是可以设置一个默认值,如果 K 不存在,则返回这个默认值,代码实现如下:
public static void main(String[] args) {
Map<String, Integer> map = new TreeMap<>();
map.put("张三", 1);
map.put("李四", 1);
map.put("王五", 1);
map.put("赵六", 1);
System.out.println(map.getOrDefault("王五",666));
System.out.println(map.getOrDefault("王", 666));
}
运行结果如下:
5)、remove
这个是在 map 中删除 K 这个变量,连带着所对应的 V 一起删除,代码实现如下:
public static void main(String[] args) {
Map<String, Integer> map = new TreeMap<>();
map.put("张三", 1);
map.put("李四", 1);
map.put("王五", 1);
map.put("赵六", 1);
System.out.println(map.getOrDefault("王五",666));
map.remove("王五");
System.out.println(map.getOrDefault("王五", 666));
}
运行结果如下:
6)、keySet
这个是返回所有不重复的 key,代码实现如下:
public static void main(String[] args) {
Map<String, Integer> map = new TreeMap<>();
map.put("张三", 1);
map.put("李四", 1);
map.put("王五", 1);
map.put("赵六", 1);
Set<String> strings = map.keySet();
System.out.println(strings);
}
运行结果如下:
7)、valuse
返回所有可以重复的 valuse,代码如下:
public static void main(String[] args) {
Map<String, Integer> map = new TreeMap<>();
map.put("张三", 1);
map.put("李四", 1);
map.put("王五", 1);
map.put("赵六", 1);
Collection<Integer> collection = map.values();
System.out.println(collection);
}
运行结果如下:
8)、entrySet
这是返回存在map中所有的 key 以及所对应的 value,但是写法有点奇怪,下面是代码实现:
public static void main(String[] args) {
Map<String, Integer> map = new TreeMap<>();
map.put("张三", 1);
map.put("李四", 1);
map.put("王五", 1);
map.put("赵六", 1);
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
System.out.println(entrySet);
}
运行结果如下:
9)、containsKey
这个方法是判断在 map 中是否存在某个 key,代码实现如下:
public static void main(String[] args) {
Map<String, Integer> map = new TreeMap<>();
map.put("张三", 1);
map.put("李四", 1);
map.put("王五", 1);
map.put("赵六", 1);
boolean ret1 = map.containsKey("张三");
boolean ret2 = map.containsKey("贾七");
boolean ret3 = map.containsKey("王八");
System.out.println(ret1);
System.out.println(ret2);
System.out.println(ret3);
}
运行结果如下:
10)、containsValue
这个跟上一个差不多,是判断是否存在某一个 value 的,具体代码可以仿照上一个 containsKey,因为太过于简单,我就不在这里过多讲述。
二、Set
2.1、Set的介绍
Set 和 Map 差不多,也是数据的集合,底层也是二叉搜索树,但是这个只能存一个 key,方法也和 Map 的大同小异,如下:
2.2、Set的方法介绍:
方法 |
解释 |
boolean add (E e) |
添加元素,但重复元素不会被添加成功 |
void clear () |
清空集合 |
boolean contains (Object o) |
判断 o 是否在集合中 |
Iterator<E> 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 中,可以达到去重的效果 |
因为这里的方法使用方式和上面 Map 差不多,所以小编就不详细展开讲解了,稍微提一下创建 Set 的方式,如下:
Set<E> set = new TreeSet<>();
三、总结
Map 和 Set 是 Java 中两个常用的数据结构,它们提供了高效地存储和操作数据的方式。
对于 Map:
- Map 是一种键值对的集合,可以使用任意类型的数据作为键和值。
- 键是唯一的,如果插入相同的键,后面的值会覆盖前面的值。
- Map 按照插入顺序排序,因此在迭代时会按照插入的顺序返回键值对。
- Map 是可迭代的,可以使用 for...of 循环或者 forEach 方法遍历。
对于 Set:
- Set 是一种存储唯一值的集合,不会存储重复的值。
- Set 按照插入顺序排序,保持元素的插入顺序。
- Set 可以存储任意类型的数据。
- Set 也是可迭代的,可以使用 for...of 循环或者 forEach 方法遍历。
在使用 Map 还是 Set 时需要根据需求进行取舍:
- 如果需要在特定的键和值之间建立映射关系,并且需要对键值对进行频繁的增删改查操作,应该使用 Map。
- 如果只关注值的唯一性,并且不需要根据键来获取值,应该使用 Set。
通过选择合适的数据结构,我们可以更高效地存储和操作数据,提高代码的性能和可读性。
希望本文对你理解和使用 Map 和 Set 有所帮助!如果有任何问题,请随时提问。
四、结语
在学习和探索编程世界中,我们常常会遇到各种不同的数据结构和算法。而其中 Map 和 Set 正是我们工具箱中的两个神奇工具。
就像生活中的绘画笔刷一样,Map 和 Set 能够帮助我们创造出绚丽多彩的代码作品。
Map,如同一块千变万化的画布,我们可以在上面选择合适的键和值,构建出各种映射关系的艺术品。它给予我们展示逻辑与创造力的机会,让我们能够更好地组织和管理数据。
Set,就像是一颗明亮的明星,它闪耀着独特的光芒。Set 帮助我们确保值的唯一性,让我们能够从繁杂的数据中提炼出真正重要的元素。它让我们有机会专注于全新的思考和解决问题的方式。
无论是 Map 还是 Set,它们都是我们编程旅程中的伙伴和助手。在冗长的代码中,它们能为我们带来简洁和高效的解决方案。在繁琐的数据处理中,它们能为我们提供更优雅的设计和更快速的操作。
正如使用不同的颜色和笔触创作绘画作品一样,Map 和 Set 为我们留下了无限的创作空间。无论是大胆尝试新的数据结构,还是精心运用细节来提升代码品质,我们都能够在其中汲取无尽的灵感。
让我们怀揣着好奇心和探索的精神,继续学习和掌握这些神奇的工具吧!愿 Map 和 Set 在你的编程之旅中,给你带来无限的快乐和成就。