详细说明Java中Map和Set接口的使用方法
Map与Set的基本概念与场景
Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。以前常见的搜索方式有:
1. 直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢。
2. 二分查找,时间复杂度为,但搜索前必须要求序列是有序的。
上述排序比较适合静态类型的查找,即一般不会对区间进行插入和删除操作了,而现实中的查找比如:
1. 根据姓名查询考试成绩
2. 通讯录,即根据姓名查询联系方式
3. 不重复集合,即需要先搜索关键字是否已经在集合中
可能在查找时进行一些插入和删除的操作,即动态查找,那上述两种方式就不太适合了,本节介绍的Map和Set是一种适合动态查找的集合容器。
模型概念
一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对,所以模型会有两种:
- 纯 key 模型,例如:
- 有一个英文词典,快速查找一个单词是否在词典中
- 快速查找某个名字在不在通讯录中
- Key-Value 模型,例如:
- 统计文件中每个单词出现的次数,统计结果是每个单词都有与其对应的次数:<单词,单词出现的次数>
- 梁山好汉的江湖绰号:每个好汉都有自己的江湖绰号
Map接口的性质
在Java中,Map
接口是一个用于存储键值对(key-value pairs)的对象,它属于Java Collections Framework的一部分。Map
接口的主要特点包括:
-
键值对存储:
Map
存储的数据是以键值对的形式组织的,每个键(key)唯一对应一个值(value)。可以通过键来快速获取对应的值。 -
无序性:大多数实现类(如
HashMap
)不会保证元素的顺序,除非使用特定的实现(如LinkedHashMap
,它可以保持插入顺序,或者TreeMap
,它会按照键的自然顺序或指定的比较器进行排序)。 -
键的唯一性:在同一个
Map
中,不能有重复的键。如果试图将一个新的值与已有的键关联,原有的值将被新值替换。 -
实现类:Java提供了多种
Map
接口的实现,例如:HashMap
:基于哈希表的实现,允许null值和null键,查找速度快。TreeMap
:基于红黑树的实现,支持排序的键,查找速度相对较慢。LinkedHashMap
:结合了HashMap
的哈希表和链表特性,维护插入顺序。
-
常用方法:
Map
接口提供了一系列的方法,例如:put(K key, V value)
:将指定的值与指定的键关联。get(Object key)
:返回指定键所映射的值。remove(Object key)
:移除指定键的键值对。containsKey(Object key)
:检查是否存在指定的键。keySet()
:返回Map中所有键的集合。values()
:返回Map中所有值的集合。
总之,Map
接口是Java中重要的数据结构之一,方便有效地进行数据的存储和检索,广泛应用于各种场景中。
Map接口的使用方法
put(K key, V value)
:将指定的值与指定的键关联。
public class Main {public static void main(String[] args) {Map<String,Integer> map = new TreeMap<>();map.put("one",1);map.put("two",2);map.put("three",3);map.put("four",4);}
}
get(Object key)
:返回指定键所映射的值。
public class Main {public static void main(String[] args) {Map<String,Integer> map = new TreeMap<>();map.put("one",1);map.put("two",2);map.put("three",3);map.put("four",4);System.out.println(map.get("two"));}
}
V getOrDefault(Object key, V defaultValue) :返回 key 对应的 value,key 不存在,返回默认值
public class Main {public static void main(String[] args) {Map<String,Integer> map = new TreeMap<>();map.put("one",1);map.put("two",2);map.put("three",3);map.put("four",4);System.out.println(map.getOrDefault("five",-1));}
}
Set<K> keySet() :返回所有 key 的不重复集合,用 Set 容器接收
public class Main {public static void main(String[] args) {Map<String,Integer> map = new TreeMap<>();map.put("one",1);map.put("two",2);map.put("three",3);map.put("four",4);Set<String> strings = map.keySet();}
}
Collection<V> values() :返回所有 value 的可重复集合 ,用 Collection 容器接收
public class Main {public static void main(String[] args) {Map<String,Integer> map = new TreeMap<>();map.put("one",1);map.put("two",2);map.put("three",3);map.put("four",4);Collection<Integer> values = map.values();System.out.println("==");}
}
Set<Map.Entry<K, V>> entrySet() :返回所有的 key-value 映射关系
public class Main {public static void main(String[] args) {Map<String,Integer> map = new TreeMap<>();map.put("one",1);map.put("two",2);map.put("three",3);map.put("four",4);Set<Map.Entry<String, Integer>> entries = map.entrySet();for (Map.Entry<String, Integer> entry : entries) {System.out.println("Key = "+entry.getKey()+" Val = "+entry.getValue());}}
}
注意:
- Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap
- Map中存放键值对的Key是唯一的,value是可以重复的
- 在TreeMap中插入键值对时,key不能为空,否则就会抛NullPointerException异常,value可以为空。但是HashMap的key和value都可以为空。
- Map中的Key可以全部分离出来,存储到Set中来进行访问(因为Key不能重复)。
- Map中的value可以全部分离出来,存储在Collection的任何一个子集合中(value可能有重复)。
- Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进行重新插入。
Set接口的性质
在Java中,Set
接口是一个用于存储唯一元素的集合,它也是Java Collections Framework的一部分。Set
接口的主要特点包括:
-
唯一性:
Set
中不允许重复的元素,这意味着集合中的每个元素都是唯一的。如果试图添加重复元素,操作将被拒绝,集合的状态不会改变。 -
无序性:
Set
通常不保证元素的顺序。尤其是使用HashSet
时,元素的存储顺序是随机的。而LinkedHashSet
可以维护元素的插入顺序,TreeSet
则会按自然顺序或自定义的比较器进行排序。 -
实现类:Java提供了多种
Set
接口的实现,包括:HashSet
:基于哈希表的实现,允许null元素,查找速度快,但不保证元素的顺序。LinkedHashSet
:结合了哈希表和链表的特性,保持元素的插入顺序。TreeSet
:基于红黑树的实现,按升序排序元素,不允许null值。
-
常用方法:
Set
接口提供了一系列的方法,例如:add(E e)
:向集合中添加元素,如果元素已存在,则返回false。remove(Object o)
:移除指定元素。contains(Object o)
:检查集合中是否包含指定元素。size()
:返回集合中元素的数量。clear()
:移除集合中的所有元素。iterator()
:返回一个迭代器,用于遍历集合中的元素。
-
应用场景:
Set
常用于需要存储不重复元素的场景,比如去重、集合运算(如交集、并集和差集)等。
总之,Set
接口是Java中重要的数据结构,适合用于处理唯一性要求的数据集合,具有高效的存储和检索特性。
Set接口的使用方法
set 接口中的方法和 Map 接口中的常见方法大差不差,就不一 一介绍了。
import java.util.TreeSet;
import java.util.Iterator;
import java.util.Set;
public static void TestSet(){Set<String> s = new TreeSet<>();// add(key): 如果key不存在,则插入,返回ture// 如果key存在,返回falseboolean isIn = s.add("apple");s.add("orange");s.add("peach");s.add("banana");System.out.println(s.size());System.out.println(s);
isIn = s.add("apple");// add(key): key如果是空,抛出空指针异常//s.add(null);// contains(key): 如果key存在,返回true,否则返回falseSystem.out.println(s.contains("apple"));System.out.println(s.contains("watermelen"));// remove(key): key存在,删除成功返回true// key不存在,删除失败返回false// key为空,抛出空指针异常s.remove("apple");System.out.println(s);s.remove("watermelen");System.out.println(s);Iterator<String> it = s.iterator();while(it.hasNext()){System.out.print(it.next() + " ");}System.out.println();
}
相关文章:

详细说明Java中Map和Set接口的使用方法
Map与Set的基本概念与场景 Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。以前常见的搜索方式有: 1. 直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢。 2. 二分查找&#x…...
CSS3 scale 适配
Scale适配,在前端开发中,特别是在CSS3中,主要指的是使用scale()函数对元素进行缩放处理,以适应不同的屏幕尺寸或达到特定的视觉效果。以下是对Scale适配的详细介绍: 一、基本概念 scale() 是CSS3中transform属性的一…...

SX_初识GitLab_1
1、对GitLab的理解: 目前对GitLab的理解是其本质是一个远程代码托管平台,上面托管多个项目,每个项目都有一个master主分支和若干其他分支,远程代码能下载到本机,本机代码也能上传到远程平台 1.分支的作用:…...

这才是 PHP 高性能框架 Workerman 的立命之本
大家好,我是码农先森。 在这个大家都崇尚高性能的时代,程序员的谈笑间句句都离不开高性能,仿佛嘴角边不挂着「高性能」三个字都会显得自己很 Low,其中众所皆知的 Nginx 就是高性能的代表。有些朋友可能连什么是高性能都不一定理解…...

Python——记录pip问题(解决下载慢、升级失败问题)
在python开发中,经常需要使用到各种各样的库。 pip又是我们常用的安装工具。但是国外的源下载速度实在太慢,经常导致超时。 有很多朋友刚刚学Python的时候,会来问为什么pip下载东西这么慢啊? 而且pycharm里面下载库也是非常的慢…...
Windows Server 2025 Preview 部署 Ⅰ—— ISO下载和硬件要求
目录 1. 预览版下载2. Windows 服务器的硬件要求2.1安装 Windows Server 2025 虚拟机注意事项2.2 CPU2.3 RAM / Memory2.4 存储 Storage2.5 网络 Network2.6 其他需求 1. 预览版下载 下载网站:https://www.microsoft.com/en-in/evalcenter/download-windows-server…...

AI2-CUDA、CuDNN、TensorRT的详细安装教程
一、查看本机的显卡 首先你要看你的电脑是否有NVIDIA的独立显卡,你可以在设备管理器-显示适配器中查看 点击“开始”--找到“NVIDA Control Panel” 点击帮助--系统信息--组件,查看NVCUDA.DLL对应的产品名称,就可以看住CUDA的版本号 这里的版…...
TCP连接中重复使用了两个相同的端口怎么办
1.检查并避免重复配置: 首先,应该检查系统的配置和应用程序的设置,确保没有错误地将多个服务或进程配置为使用相同的端口号。 使用网络监控工具(如netstat、ss等)来查看当前哪些端口正在被使用。 2.使用端口复用选项…...
如何自定义异常
目录 为什么自定义异常自定义异常的步骤参考资料 为什么自定义异常 自定义异常是指开发者根据应用程序的需求和逻辑,自行定义的异常类。与 Java 提供的标准异常类(如 NullPointerException、IOException 等)不同,自定义异常允许程…...

C++中的依赖注入
目录 1.概述 2.构造函数注入 3.setter方法注入 4.接口注入 5.依赖注入框架 6.依赖注入容器 7.依赖注入框架的工作原理 8.依赖注入的优势 9.总结 1.概述 依赖注入是一种设计模式,它允许我们在不直接创建对象的情况下为对象提供其依赖项;它通过将…...
CSS平面转换-平移
平面转换-平移 属性 transform: translate(X轴移动距离, Y轴移动距离); 取值 像素单位取值百分比(参照盒子自身尺寸计算结果)正负均可 技巧translate()只写一个值表示只沿着X轴移动单独设置X或Y轴距离:translateX()或translateY() 代码 …...

Linux-3:Shell编程——基础语法(0-50%)
目录 前言 一、变量 1.定义变量 2.使用变量 3.修改变量 4.将命令的结果赋值给变量 5.只读变量 6.删除变量 二、传递参数 三、字符串 1.字符串举例 2.统计字符串长度 3.字符串拼接 4.截取字符串 总结 前言 Shell是一种程序设计语言。作为命令语言,它…...
C++ --> string类模拟实现(附源码)
欢迎来到我的Blog,点击关注哦💕 前言: C中STL扮演着极其重要的角色,学习C重中之重的就是学习STL,虽然string不作为containers的其中一员,但是也是值得学习的le类。下面就进行string的模拟实现 string的模拟…...

基于PHP+MySQL组合开发的微信活动投票小程序源码系统 带完整的安装代码包以及搭建部署教程
系统概述 在当今数字化时代,微信作为社交媒体的巨头,为企业和个人提供了丰富的互动营销平台。其中,投票活动作为一种有效的用户参与和互动方式,被广泛应用于各种场景。为了满足这一需求,我们推出了一款基于PHPMySQL组…...

利用Arcgis设置分式标注(分子分母标注)
因工作需要,需要设置分式标注,下面详细介绍下如何利用arcgis 设置分式标注,以下操作以供参考,如有疑义可提出。 一、准备工作 软件:arcmap 示例数据:行政区shp矢量图 二、操作步骤 1.添加数据 将行政区sh…...

大麦网抢票攻略:使用Python Selenium实现
随着互联网技术的发展,在线购票已成为人们获取演出、比赛等活动门票的主要方式。然而,面对热门活动,门票往往在开售瞬间被抢购一空。为了解决这一问题,本文将介绍如何利用Python和Selenium技术实现大麦网的自动抢票。 1. 环境准备…...

Navicat 在整个数据库中查找字符
Navicat 在整个数据库中查找字符 1.首先打开Navicat,连接目标数据库。2.选择工具选项卡,选择在数据库或模式中查找。3.查找前填入关键字信息,点击查找4.双击查找到数据,进行查看 说明:当我们知道数据库有数据的关键字,…...
Python基础—处理时间问题
一文帮助您解决99%时间处理问题...

如何选择合适的自动化测试工具!
选择合适的自动化测试工具是一个涉及多方面因素的决策过程。以下是一些关键步骤和考虑因素,帮助您做出明智的选择: 一、明确测试需求和目标 测试范围:确定需要自动化的测试类型(如单元测试、集成测试、UI测试等)和测试…...

数字图像边缘曲率计算及特殊点检测
一、曲率和数字图像边缘曲率检测常用方法简介 边缘曲率作为图像边缘特征的重要参数,不仅反映了边缘的几何形状信息,还对于图像识别、图像分割、目标跟踪等任务具有显著影响。 曲线的曲率(curvature)就是针对曲线上某个点的切线方向…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
Android屏幕刷新率与FPS(Frames Per Second) 120hz
Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数,单位是赫兹(Hz)。 60Hz 屏幕:每秒刷新 60 次,每次刷新间隔约 16.67ms 90Hz 屏幕:每秒刷新 90 次,…...

表单设计器拖拽对象时添加属性
背景:因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...

河北对口计算机高考MySQL笔记(完结版)(2026高考)持续更新~~~~
MySQL 基础概念 数据(Data):文本,数字,图片,视频,音频等多种表现形式,能够被计算机存储和处理。 **数据库(Data Base—简称DB):**存储数据的仓库…...

华硕电脑,全新的超频方式,无需进入BIOS
想要追求更佳性能释放 或探索更多可玩性的小伙伴, 可能会需要为你的电脑超频。 但我们常用的不论是BIOS里的超频, 还是Armoury Crate奥创智控中心超频, 每次调节都要重启,有点麻烦。 TurboV Core 全新的超频方案来了 4不规…...
【免杀】C2免杀技术(十五)shellcode混淆uuid/ipv6/mac
针对 shellcode 混淆(Shellcode Obfuscation) 的实战手段还有很多,如下表所示: 类型举例目的编码 / 加密XOR、AES、RC4、Base64、Poly1305、UUID、IP/MAC改变字节特征,避开静态签名或 YARA结构伪装PE Stub、GIF/PNG 嵌入、RTF OLE、UUID、IP/MAC看起来像合法文件/数据,弱…...

【HTML】HTML 与 CSS 基础教程
作为 Java 工程师,掌握 HTML 和 CSS 也是需要的,它能让你高效与前端团队协作、调试页面元素,甚至独立完成简单页面开发。本文将用最简洁的方式带你掌握核心概念。 一、HTML,网页骨架搭建 核心概念:HTML通过标签定义内…...