当前位置: 首页 > news >正文

Map 和 Set

目录

一、搜索

概念:

模型:

二、Map

​编辑

      1.Map 实例化:

   2. Map的常见方法:

3.Map的常见方法演示:

1. put(K key, V value):添加键值对

3. containsKey(Object key):检查键是否存在

4. containsValue(Object value):检查值是否存在

5. remove(Object key):删除指定键的键值对

6. keySet():获取所有键的集合

7. values():获取所有值的集合

8. entrySet():遍历所有键值对

9.  getOrDefault(Object key, V defaultValue);

4.Map 的注意事项:

三、Set

1. Set 常见方法:

2. Set 常见方法演示:

containsAll 方法:

addAll 方法:

3.Set 的注意事项:


一、搜索

概念:

        在之前,以前我们学习常见的搜索方式有:

        1. 直接遍历,元素如果比较多效率会非常慢。

        2. 二分查找,但搜索前必须要求序列是有序的。

        上述排序比较适合静态类型的查找,即⼀般不会对区间进行插入和删除操作了,而现实中的查找比如:

        1. 根据姓名查询考试成绩

        2. 通讯录,即根据姓名查询联系方式

        3. 不重复集合,即需要先搜索关键字是否已经在集合中

        可能在查找时进行⼀些插入和删除的操作,即动态查找,那上述两种方式就不太适合了,所以下文介绍的 MapSet是⼀种适合动态查找的集合容器。

        

模型:

        一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对,所以模型会有两种

        

        1. 纯 key 模型:由唯一的键(key)组成,没有与键直接关联的特定值(value)。

        有⼀个英文词典,快速查找⼀个单词是否在词典中

        快速查找某个名字在不在通讯录中

        

        2. Key-Value 模型:是一种键(key)和值(value)进行相关联的数据组织形式。每个键都对应着一个特定的值,通过键可以快速查找、更新与之关联的值。如查找在一串字符串中查找,某个单词在该字符串中出现的次数。

        统计文件中每个单词出现的次数,统计结果是每个单词都有与其对应的次数:<单词,单词出现的次数>。

         梁山好汉的江湖绰号:每个好汉都有自己的江湖绰号

        

        并且,要注意的是:

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

        

二、Map

         可以看到,HashMap 和 TreeMap 都实现了 Map 接口。

        那么,就可以 利用 Map 接口类型的变量来引用 HashMap 或 TreeMap 的实例化:

      1.Map 实例化:

Map<String, Integer> map1 = new TreeMap<>();Map<String, Integer> map2 = new HashMap<>();

         Map是一个接口,不能直接实例化对象,如果要实例化对象只能通过其实现类TreeMap或者HashMap来实现。

        Map该接口类中存储的是结构的键值对,并且K⼀定是唯⼀的(比如上面代码的String ),不能重复。

   2. Map的常见方法:

        

3.Map的常见方法演示:

以 HashMap 实例化 Map 接口演示:  

Map<String, Integer> hashMap = new HashMap<>();

1. put(K key, V value):添加键值对

hashMap.put("Apple", 10);
hashMap.put("Banana", 5);
hashMap.put("Orange", 8);

2. get(Object key):根据键获取值

int appleCount = hashMap.get("Apple");
System.out.println(appleCount); // 10
3. containsKey(Object key):检查键是否存在
boolean hasMango = hashMap.containsKey("Mango");
System.out.println(hasMango); // false
4. containsValue(Object value):检查值是否存在
boolean hasCount5 = hashMap.containsValue(5);
System.out.println(hasCount5); // true
5. remove(Object key):删除指定键的键值对
hashMap.remove("Banana");
System.out.println(hashMap); // {Apple=10, Orange=8}
6. keySet():获取所有键的集合
for (String key : hashMap.keySet()) {System.out.println("Key: " + key);
}
// 输出:
// Key: Apple
// Key: Orange
7. values():获取所有值的集合
for (int value : hashMap.values()) {System.out.println("Value: " + value);
}
// 输出:
// Value: 10
// Value: 8
8. entrySet():遍历所有键值对
for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {System.out.println(entry.getKey() + " -> " + entry.getValue());
}
// 输出:
// Apple -> 10
// Orange -> 8
9.  getOrDefault(Object key, V defaultValue);

该方法会尝试根据给定的键从中获取对应的值。如果键存在,就返回该键对应的值;若键不存在,则返回你提供的默认值(defaultValue)。

int integer = hashMap.getOrDefault("Apple",666);System.out.println(integer); // 10int integer1 = hashMap.getOrDefault("waht",666);System.out.println(integer1); // 666

4.Map 的注意事项:

        

1. Map是⼀个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者 HashMap

2. Map中存放键值对的Key是唯⼀的,value是可以重复的,(当put相同的key,不同的value值时,只是将key所对应的value值进行替换,以最后存放的value为主)。

 Map<String, Integer> hashMap = new HashMap<>();hashMap.put("Apple", 10);hashMap.put("Apple",15);hashMap.put("Apple",40);System.out.println(hashMap.get("Apple")); // 40

 

3. HashMap的key和value都可以为空,在TreeMap中插入键值对时,key不能为空,value可以为空。

4.Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然 后再重新插入。

        

TreeMap和HashMap是Map的接口实现类,用于存储键对值数据,以下是他们的区别:       

三、Set

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

1. Set 常见方法:

  1. add(E e):如果指定元素不存在于集合中,则将其添加到集合里。添加成功返回 true,若元素已存在则返回 false
  2. remove(Object o):如果集合中存在指定元素,则将其移除。移除成功返回 true,若元素不存在则返回 false
  3. contains(Object o):判断集合中是否包含指定元素,包含则返回 true,否则返回 false
  4. size():返回集合中元素的数量。
  5. isEmpty():判断集合是否为空,为空返回 true,否则返回 false
  6. clear():移除集合中的所有元素。
  7. iterator():返回一个用于遍历集合的迭代器。
  8. toArray():将set中的元素转换为数组。
  9. containsAll: 是否包含指定集合的所有元素。
  10.  addAll:将集合中的元素添加到指定集合中。如果添加的元素在当前集合中已经存在,则不会重复添加。

2. Set 常见方法演示:

public static void main(String[] args) {// 创建一个 HashSet 实例,使用 Set 接口引用Set<String> set = new HashSet<>();// 1. add(E e) 方法:添加元素set.add("apple");set.add("banana");set.add("cherry");System.out.println("添加元素后的集合: " + set); //[banana, apple, cherry]// 尝试添加重复元素boolean isAdded = set.add("apple");System.out.println("尝试添加重复元素 'apple',是否添加成功: " + isAdded); // falseSystem.out.println("添加重复元素后的集合: " + set); //[banana, apple, cherry]// 2. remove(Object o) 方法:移除元素boolean isRemoved = set.remove("banana");System.out.println("移除元素 'banana',是否移除成功: " + isRemoved); //trueSystem.out.println("移除元素后的集合: " + set); // [apple, cherry]// 3. contains(Object o) 方法:判断元素是否存在boolean containsElement = set.contains("cherry"); System.out.println("集合中是否包含元素 'cherry': " + containsElement); //true// 4. size() 方法:获取集合元素数量int size = set.size();System.out.println("集合中元素的数量: " + size); // 2// 5. isEmpty() 方法:判断集合是否为空boolean isEmpty = set.isEmpty();System.out.println("集合是否为空: " + isEmpty); //false// 6. clear() 方法:清空集合set.clear();System.out.println("清空集合后,集合是否为空: " + set.isEmpty()); //true// 重新添加元素set.add("date");set.add("elderberry");// 7. iterator() 方法:使用迭代器遍历集合System.out.println("使用迭代器遍历集合:");Iterator<String> iterator = set.iterator();while (iterator.hasNext()) {System.out.println(iterator.next()); }//date//elderberry}

toArray 方法 :

 Set<Integer> set1 = new HashSet<>();set1.add(5);set1.add(20);set1.add(15);set1.add(8);Integer[] toArray = set1.toArray(new Integer[0]);for (Integer a : toArray) {System.out.print(a + " ");}System.out.println(); // 20 5 8 15 

containsAll 方法:

 Set<String> set1 = new HashSet<>();set1.add("apple");set1.add("banana");set1.add("cherry");Set<String> set2 = new HashSet<>();set2.add("apple");set2.add("banana");boolean result = set1.containsAll(set2);System.out.println("set1 是否包含 set2 中的所有元素: " + result); //true

addAll 方法:

Set<String> set1 = new HashSet<>();set1.add("apple");set1.add("banana");Set<String> set2 = new HashSet<>();set2.add("banana");set2.add("cherry");set1.addAll(set2);System.out.println("添加元素后的 set1: " + set1); // [banana, apple, cherry]

3.Set 的注意事项:

1. Set 可以对集合进行去重。

2. Set只存储了key,并且要求key一定要唯一。

3其key值不能进行修改,如果要修改需要删除后,再重新插入。

4. TreeSet的底层是使⽤Map来实现的,其使⽤key与Object的⼀个默认对象作为键值对插⼊到Map中 的 。 在 TreeSet 中,要存储的元素被作为 TreeMap 的 key而 TreeMap 的 value 则统一使用一个静态的、不可变的 Object 对象来占位,因为 TreeSet 只关心元素本身,并不需要额外存储与元素关联的值。

  TreeSet 和 HashSet 的区别:

        

相关文章:

Map 和 Set

目录 一、搜索 概念&#xff1a; 模型&#xff1a; 二、Map ​编辑 1.Map 实例化&#xff1a; 2. Map的常见方法&#xff1a; 3.Map的常见方法演示&#xff1a; 1. put(K key, V value)&#xff1a;添加键值对 3. containsKey(Object key)&#xff1a;检查键是否存在 4.…...

STOMP协议

引用&#xff1a;https://blog.csdn.net/print_helloword/article/details/142597122 什么是STOMP协议 STOMP (simple text oriented messaging protocol): 一种简单的&#xff0c;基于文本的消息传输协议&#xff0c;&#xff0c;&#xff0c;最初是为了解决在消息队列中&am…...

手动埋点的demo

上代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>埋点示例</title> </head><b…...

大模型开发实战篇5:多模态--文生图模型API

大模型文生图是一种基于人工智能大模型的技术&#xff0c;能够将自然语言文本描述转化为对应的图像。目前非常火的AI大模型赛道&#xff0c;有很多公司在此赛道竞争。详情可看这篇文章。 今天我们来看下如何调用WebAPI来实现文生图功能。我们一般都会将OpenAI的接口&#xff0…...

【大模型】DeepSeek 高级提示词技巧使用详解

目录 一、前言 二、DeepSeek 通用提示词技巧 2.1 DeepSeek 通用提示词技巧总结 三、DeepSeek 进阶使用技巧 3.1 DeepSeek一个特定角色的人设 3.1.1 为DeepSeek设置角色操作案例一 3.1.2 为DeepSeek设置角色操作案例二 3.2 DeepSeek开放人设升级 3.2.1 特殊的人设&#…...

【第14章:神经符号集成与可解释AI—14.2 可解释AI技术:LIME、SHAP等的实现与应用案例】

在这里插入图片描述 凌晨三点的ICU病房,值班医生李主任盯着AI辅助诊断系统的红色警报——这套准确率高达95%的深度学习系统,突然建议对一位肾衰竭患者进行肝移植手术。正当医疗组陷入混乱时,李主任打开了系统的"解释模式",屏幕上立即跳出SHAP分析图:模型误将CT…...

Python中使用Minio实现图像或视频文件的存储

目录 一、Minio的基本介绍1.Minio是什么2.Minio的优势 二、使用步骤1.启动Minio2.创建桶3.在Python中使用Minio3.1安装并导入minio包3.2创建mino_utils工具类 三、操作演示1.引入minio_utils工具类2.上传视频文件3.获取视频文件 总结 一、Minio的基本介绍 1.Minio是什么 Mini…...

Kubernetes-master 组件

以下是Kubernetes Master Machine的组件。 etcd 它存储集群中每个节点可以使用的配置信息。它是一个高可用性键值存储&#xff0c;可以在多个节点之间分布。只有Kubernetes API服务器可以访问它&#xff0c;因为它可能具有一些敏感信息。这是一个分布式键值存储&#xff0c;所…...

人形机器人 - 仿生机器人核心技术与大小脑

以下是针对仿生机器人核心技术的结构化总结,涵盖通用核心技术与**“大脑-小脑”专用架构**两大方向: 一、机器人通用核心技术 这些技术是仿生机器人实现功能的基础,与生物体的“身体能力”对应: 1. 感知与交互技术 多模态传感器融合 视觉:3D视觉(如RGB-D相机)、动态目…...

OpenAI 快速入门

文章来源&#xff1a;OpenAI开发者平台 | OpenAI开发文档|OpenAI中文官方文档|ChatGPT中文版|ChatGPT教程 开发人员快速入门 了解如何发出您的第一个 API 请求。 OpenAI API 为最先进的 AI 模型提供了一个简单的接口&#xff0c;用于自然语言处理、图像生成、语义搜索和语音识…...

nginx 实战配置

一、配置一个默认80端口的&#xff0c;静态页面&#xff0c;路径是path1。 http://192.168.0.111/path1 &#xff0c; /path1路径指向linux的/data/index1.html vi /data/nginx-1.24.0/conf/nginx.conf 文件添加以下配置 location /path1 { alias /data/…...

WebMvcConfigurer 介绍

WebMvcConfigurer 介绍 1. 什么是WebMvcConfigurer 介绍2. WebMvcConfigurer接口常用的方法3. 使用WebMvcConfigurer实现跨域4. 使用WebMvcConfigurer配置拦截器5. 使用WebMvcConfigurer配置静态资源5.1 配置外部目录&#xff08;本地文件系统&#xff09;详细解释 6. 使用 Web…...

java05(类、泛型、JVM、线程)---java八股

类 Java中有哪些类加载器 JDK自带有三个类加载器&#xff1a;bootstrap ClassLoader、ExtClassLoader、AppClassLoader。 ●BootStrapClassLoader是ExtClassLoader的父类加载器&#xff0c;默认负责加载%JAVA_HOME%lib下的jar包和class文件。 ●ExtClassLoader是AppClassLoade…...

Python+appium实现自动化测试

目录 一、工具与环境准备 二、开始测试 1、插上手机&#xff0c;打开usb调试&#xff0c;选中文件传输&#xff0c;我这里用华为手机为例 2、启动Appium Server GUI​编辑 3、启动 Inspector Session 4、录制脚本 使用Python和Appium进行自动化测试是一种常见的移动应用…...

Unity中如何判断URL是否为RTSP或RTMP流

技术背景 如何在Unity中判断一个字符串URL是否是RTSP或RTMP流。首先&#xff0c;RTSP通常以“rtsp://”开头&#xff0c;而RTMP则是“rtmp://”或者有时是“rtmps://”用于安全连接。 接下来&#xff0c;如何在C#中进行字符串的检查。最简单的方法应该是检查URL是否以这些协议…...

基于角色访问控制的UML 表示02

一个用户可以成为很多角色的成员&#xff0c;一个角色可以有许多用户。类似地&#xff0c;一个角色可以有多个权限&#xff0c;同一个权限可以被指派给多个角色。每个会话把一个用户和可能的许多角色联系起来。一个用户在激发他或她所属角色的某些子集时&#xff0c;建立了一个…...

【函数题】6-10 二分查找

6-10 二分查找 1 题目原文2 思路解析2.1 基本二分查找算法2.2 常用二分模板2.2.1 第一个大于等于目标值的元素下标2.2.2 第一个大于目标值的元素下标2.2.3 最后一个小于等于目标值的元素下标2.2.3 最后一个小于目标值的元素下标2.2.4 小结 3 代码实现3.1 本题代码实现3.1.1 递归…...

关于conda换镜像源,pip换源

目录 1. 查看当前下载源2. 添加镜像源2.1清华大学开源软件镜像站2.2上海交通大学开源镜像站2.3中国科学技术大学 3.删除镜像源4.删除所有镜像源&#xff0c;恢复默认5.什么是conda-forge6.pip换源 1. 查看当前下载源 conda config --show channels 如果发现多个 可以只保留1个…...

DeepSeek与ChatGPT的全面对比

在人工智能&#xff08;AI&#xff09;领域&#xff0c;生成式预训练模型&#xff08;GPT&#xff09;已成为推动技术革新的核心力量。OpenAI的ChatGPT自发布以来&#xff0c;凭借其卓越的自然语言处理能力&#xff0c;迅速占据市场主导地位。然而&#xff0c;近期中国AI初创公…...

Spring AI发布!让Java紧跟AI赛道!

1. 序言 在当今技术发展的背景下&#xff0c;人工智能&#xff08;AI&#xff09;已经成为各行各业中不可忽视的重要技术。无论是在互联网公司&#xff0c;还是传统行业&#xff0c;AI技术的应用都在大幅提升效率、降低成本、推动创新。从智能客服到个性化推荐&#xff0c;从语…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究

摘要&#xff1a;在消费市场竞争日益激烈的当下&#xff0c;传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序&#xff0c;探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式&#xff0c;分析沉浸式体验的优势与价值…...