首页 > 其他分享 >Map and Set详解

Map and Set详解

时间:2023-09-26 23:02:41浏览次数:38  
标签:Map Set map 详解 key 王五 put


在 Java 编程中,Map 和 Set 是两个非常常用的数据结构。Map 提供了一种键值对的映射关系,使我们可以根据键来快速访问和操作对应的值。它的灵活性和高效性使得 Map 在各种场景中都得到了广泛的应用,比如存储配置信息、缓存数据等等。

而Set则是一种不重复元素的集合,它通过哈希表来存储元素,保证了快速的插入和查询操作。使用 Set 的好处是可以轻松地去除重复元素,同时还能进行集合之间的交、并、差等操作,非常适合处理需要保持唯一性的数据。

本篇博客将深入探讨 Java 中的 Map 和 Set,包括它们的基本概念、常见的实现类、常用操作以及适用场景。通过学习 Map 和 Set 的使用技巧,你将能够更加高效地处理和管理数据,提升你的 Java 编程技能。

Map and Set详解_代码实现

一、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 中插好了四个数据,如下:

Map and Set详解_代码实现_02

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("王"));
}

结果如下:

Map and Set详解_System_03

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));
}

运行结果如下:

Map and Set详解_System_04

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));
}

运行结果如下:

Map and Set详解_代码实现_05

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);
}

运行结果如下:

Map and Set详解_代码实现_06

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);
}

运行结果如下: 

Map and Set详解_System_07

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);
}

运行结果如下:

Map and Set详解_System_08

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);
}

运行结果如下:

Map and Set详解_System_09

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 在你的编程之旅中,给你带来无限的快乐和成就。

希望这份心灵鸡汤能够给你带来一丝温暖和鼓励,激发你在使用 Map 和 Set 中的创造力!如果有任何问题,请随时提问。

标签:Map,Set,map,详解,key,王五,put
From: https://blog.51cto.com/bitzmbdp/7615478

相关文章

  • IDEA中的java代码Getters和Setters报红问题解决办法【杭州多测师_王sir】
    今天在新的编辑器中导入新项目时,发现很多get、set、toString的相关方法全部报红,仔细排查发现,原来是bean中注解采用lombok来自动生成get、set、toStirng、equals等方法,而新的编辑器未安装lombok plugin,所以全部报红。Lombok简介项目中经常使用bean,entity等类,绝大部分数据类类中都......
  • RosettaNet PIP 清单
    PIPCode释义0A1故障通知0C1异步测试通知0C2异步测试请求/确认0C3同步测试通知0C4同步测试查询/响应1A1请求帐户设置1A2维护帐户2A1分发新产品信息2A3查询营销信息2A4查询促销和回扣信息2A6查询产品生命周期信息2A7查询产品停......
  • KdMapper扩展实现之MICSYS(MsIo64.sys)
    1.背景  KdMapper是一个利用intel的驱动漏洞可以无痕的加载未经签名的驱动,本文是利用其它漏洞(参考《【转载】利用签名驱动漏洞加载未签名驱动》)做相应的修改以实现类似功能。需要大家对KdMapper的代码有一定了解。 2.驱动信息 驱动名称MsIo64.sys 时间戳5DA7C......
  • 详解达梦disql工具
    连接达梦数据库必须要用到两个工具,一个是disql,另一个是图形界面的DM管理工具。disql是达梦数据库的命令行交互工具,类似于Oracle的sqlplus,虽然DM管理工具可以在大部分场景代替siaql的功能,但是有些命令必须在disql下去执行,例如desccitydisqlV8SQL>desccity disql在......
  • Android动画-1——Android三种动画详解
    一、前言1.Android的三种动画,即:ViewAnimation(视图动画)DrawableAnimation(帧动画)PropertyAnimation(属性动画) 二、ViewAnimation(视图动画)1.View动画的概述及种类视图动画的作用对象是View,支持四种动画效果,分别是平移、缩放、旋转、透明度。譬如,我们可以对TextView设......
  • Spring中构造器、init-method、@PostConstruct、afterPropertiesSet孰先孰后,自动注入
     引用:https://www.cnblogs.com/qlqwjy/p/9417034.html首先明白,spring的IOC功能需要是利用反射原理,反射获取类的无参构造方法创建对象,如果一个类没有无参的构造方法spring是不会创建对象的。在这里需要提醒一下,如果我们在class中没有显示的声明构造方法,默认会生成一个无参......
  • c#中适配器模式详解
    基础介绍:  想象这样一个场景,原项目中接口返回的数据是XML格式的数据,但现在来了一个新客户,它期望接口返回的数据类型为json格式的。  想要实现要么就是改原有接口,但这样就违反了开闭原则,容易出现未知bug,影响到老客户的正常使用。  而如果写一个适配器类也就是转换类(第三方......
  • 一个用于处理 slice 和 map 的实用程序库,侧重于类型安全和性能的开源库
    一个用于处理slice和map的实用程序库,侧重于类型安全和性能的开源库。GitHub地址:https://github.com/elliotchance/pie快速开始pie现阶段的版本是v2,要求Go1.18+,支持泛型。如果是Go1.17或更低版本,则必须使用v1版本(https://github.com/elliotchance/pie/v1)。packagemain......
  • docker 安装superset
    docker安装superset目录docker安装superset1.安装docker和dockercompose2.克隆Superset的GitHub3.通过DockerCompose4.配置DockerCompose5.登录Superset6.将Superset连接到本地数据库实例7.解决无法登录一直还在登录界面问题内容安全策略(CSP)8.此处为修改的文......
  • 【python】只需一段代码,剪辑一个视频——Moviepy详解
    http://www.shanhubei.com/archives/2757.html前言知道吗,用moviepy一行代码就能够快速剪辑视频中某个区间的片段:clip=VideoFileClip(“videoplayback.mp4”).subclip(50,60)这一段代码,能够在3秒内将videoplayback.mp4的50秒-60秒的视频片段提取出来,非常方便。仅如此,movie......