Map和Set(JAVA)

news2024/11/25 20:45:07

本篇文章建议在了解了哈希表二叉搜索树后食用更佳。
链接: 二叉搜索树 和 哈希表 (JAVA)

Map和Set都是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。

Map接口

  • Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap;
Map<Integer,Integer> map1 = new HashMap<>();
Map<Integer,Integer> map2 = new TreeMap<>();

Map接口并没有继承Collection,该类中存储的是<K,V>结构的键值对,并且K是唯一的且不能重复,Value可以重复
Map中的数据是以Key-Value 模型来存储的。
一般搜索的数据被称为Key,而它的值被成为Value
例如:用Key-Value 模型来统计单词出现的次数就可以存储为:<单词,单词出现的次数>。

Map中的一些常用方法:

put(key, value)

如果不存在 Key 就插入当前 key-value 键值对,如果存在当前 Key 则更新 key 对应的 value值。

Map<String,Integer> map = new TreeMap<>();
map.put("zhangsan", 5);
System.out.println(map);

在这里插入图片描述

Map<String,Integer> map = new TreeMap<>();
map.put("zhangsan", 5);
map.put("zhangsan", 10);
System.out.println(map);

在这里插入图片描述

get(Key)

返回 key 对应的 value;如果没有对应的 Key 则返回 null。

Map<String,Integer> map = new TreeMap<>();
map.put("zhangsan", 5);
System.out.println(map.get("zhangsan"));

在这里插入图片描述

Map<String,Integer> map = new TreeMap<>();
map.put("zhangsan", 5);
System.out.println(map.get("zll"));

在这里插入图片描述

getOrDefault(key, defaultValue)

返回 key 对应的 value,key 不存在,返回 defaultValue 。

Map<String,Integer> map = new TreeMap<>();
map.put("zhangsan", 5);
System.out.println(map.getOrDefault("zhangsan", 0));
System.out.println(map.getOrDefault("llll", 0));

在这里插入图片描述

remove(key)

删除 key 对应的映射关系(删除 Key 和它对应的 Value) ,并返回 Value,如果当前 key 不存在就返回 null 。

Map<String,Integer> map = new TreeMap<>();
map.put("zhangsan", 5);
map.put("lisi", 5);
map.put("wangwu", 5);
System.out.println(map);
//删除“zhangsan”返回5
System.out.println(map.remove("zhangsan"));
//因为不存在“zhangsan”返回null
System.out.println(map.remove("zhangsan"));
System.out.println(map);

在这里插入图片描述

void clear()

删除集合中的所有键值对

 Map<String,String> map = new TreeMap<>();
 map.put("sd","sd");
 System.out.println(map);
 map.clear();
 System.out.println(map);

在这里插入图片描述

size()

返回map中的键值对的数量。

Map<String,String> map = new TreeMap<>();
map.put("sd","sd");
System.out.println(map.size());

在这里插入图片描述

Set < K > keySet()

返回包含所有 key 的一个集合对象。
此方法的返回值是 Set 类型的集合,该集合中包含当前类中的所有 key 关键字(Set 中不能存储重复的值)。

Map<String,Integer> map = new TreeMap<>();
map.put("zhangsan", 5);
map.put("lisi", 5);
map.put("wangwu", 5);
System.out.println(map);
Set<String> tmp = map.keySet();
System.out.println(tmp);

在这里插入图片描述

boolean isEmpty()

判断当前map集合中是否为空。
空就返回true;否则返回false。

Map<String,String> map = new TreeMap<>();
System.out.println(map.isEmpty());
map.put("sd","sd");
System.out.println(map.isEmpty());

在这里插入图片描述

Collection< V > values()

返回所有 value 的可重复集合。
和上面的 keySet() 方法差不多,这个方法是返回 Values 组成的集合。

Map<String,Integer> map = new TreeMap<>();
map.put("zhangsan", 5);
map.put("lisi", 5);
map.put("wangwu", 5);
System.out.println(map);
Collection<Integer> tmp = map.values();
System.out.println(tmp);

在这里插入图片描述

containsKey(key)

判断是否包含该 key,返回类型是boolean类型。

containsValue(value)

判断是否包含该 value,返回类型是boolean类型。

Set<Map.Entry<K, V>> entrySet()

返回所有的 key-value 映射关系。
在了解这个方法前先了解一下 Map.Entry<K, V> 。

Map.Entry<K, V>

Map 其实你可以想象成一个链表它里面的每一个 key-value 键值对都是以节点的形式来存储的而Map.Entry<K, V> 就是Map内部实现的用来存放<key, value>键值对映射关系的内部类
Map.Entry<K, V> 中主要提供了<key, value>的获取,value的设置以及Key的比较方式

  • getKey(): 返回 entry 中的 key
  • getValue(): 返回 entry 中的 value
  • setValue(V value): 将键值对中的value替换为指定value

此时再来看 entrySet() 方法:
entrySet() 方法其实就是返回 map 集合中的所有节点然后将其作为一个整体存放在 Set 类型的集合中

Map<String,Integer> map = new TreeMap<>();
map.put("zhangsan", 5);
map.put("lisi", 5);
map.put("wangwu", 5);
Set<Map.Entry<String,Integer>> tmp = map.entrySet();
//第一种遍历方式
System.out.println(tmp);
System.out.println("===========");
//第二种遍历方式
for (Map.Entry<String,Integer> a:map.entrySet()) {
System.out.println("Key:"+a.getKey()+" "+"Value"+a.getValue());
}

在这里插入图片描述

Map 的一些注意事项

  • Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap;
  • Map中存放键值对的Key是唯一的,value是可以重复的;
  • TreeMap中插入键值对时,key不能为空,否则就会抛NullPointerException异常,value可以为空。但是HashMap的key和value都可以为空;
  • Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进行重新插入。

TreeMap和HashMap的区别:

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

Set 接口

Set相比于Map要简单很多。

  • Set是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeSet或者HashSet。
Set<Integer> set1 = new HashSet<>();
Set<Integer> set2 = new TreeSet<>();

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

Set中的一些常用方法:

boolean add(Object o)

添加元素
添加成功返回true;失败返回false。

Set<String> set = new TreeSet<>();
System.out.println(set.add("asd"));
//因为该元素已经存在了,所以不会添加成功,返回false
System.out.println(set.add("asd"));

在这里插入图片描述

boolean addAll(Collection<? extendsE>c)

将集合c中的元素添加到set中,可以达到去重的效果

void clear()

清空集合

 Set<String> set = new TreeSet<>();
 set.add("a");
 set.add("s");
 set.add("d");
 set.add("g");
 System.out.println(set);
 //删除所有元素
 set.clear();
 System.out.println(set);

在这里插入图片描述

boolean contains(Object o)

判断 o 是否在集合中

Set<String> set = new TreeSet<>();
set.add("a");
set.add("s");
set.add("d");
set.add("g");
System.out.println(set.contains("s"));
System.out.println(set.contains("hhh"));

在这里插入图片描述

Iterator iterator()

返回一个迭代器

Set<String> set = new TreeSet<>();
set.add("a");
set.add("s");
set.add("d");
set.add("g");
//利用迭代器进行集合的遍历
Iterator<String> tmp = set.iterator();
while (tmp.hasNext()) {
    System.out.print(tmp.next()+" ");
}

在这里插入图片描述

boolean remove(Object o)

删除集合中的 o
成功删除返回true;失败返回false。

Set<String> set = new TreeSet<>();
set.add("a");
set.add("s");
set.add("d");
set.add("g");
System.out.println(set.remove("a"));
//因为集合中不存在“asd”所以删除失败,返回false
System.out.println(set.remove("asd"));

在这里插入图片描述

int size()

返回set集合中元素的个数

Set<String> set = new TreeSet<>();
set.add("a");
set.add("s");
set.add("d");
set.add("g");
System.out.println(set.size());

在这里插入图片描述

boolean isEmpty()

检测set是否为空,空返回true,否则返回false

Set<String> set = new TreeSet<>();
System.out.println(set.isEmpty());
set.add("a");
set.add("s");
System.out.println(set.isEmpty());

在这里插入图片描述

Object[] toArray()

将set中的元素转换为数组返回

Set<String> set = new TreeSet<>();
set.add("a");
set.add("s");
Object[] tmp =set.toArray();
for (int i = 0; i < 2; i++) {
    System.out.println(tmp[i]);
}

在这里插入图片描述

Set<String> set = new TreeSet<>();
set.add("a");
set.add("s");
//此处不能进行强制类型转换
String[] tmp =(String[]) set.toArray();
System.out.println(tmp);

在这里插入图片描述

boolean containsAll(Collection<?> c)

集合c中的元素是否在set中全部存在,是返回true,否则返回false

Set 的一些注意事项

  • Set是继承自Collection的一个接口类;
  • Set中只存储了key,并且要求key一定要唯一
  • TreeSet的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的;
  • Set最大的功能就是对集合中的元素进行去重;
  • 实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础上维护了一个双向链表来记录元素的插入次序;
  • Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入
  • TreeSet中不能插入null的key,HashSet可以

TreeSet和HashSet的区别:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1167481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kibana显示时间数据时的时区问题及时间显示格式设置

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

电源纹波示波器测试方法:示波器纹波测试步骤详解

示波器测试电源纹波的步骤 一、准备测试设备 测试之前选择一台示波器和合适的电压探头。探头有无源探头和有源探头两种&#xff0c;综合来讲一般选择衰减比例1:1的无源探头测量输出阻抗及频率较低的电源纹波。 二、连接电源 连接示波器探头和电源输出端&#xff0c;确保连接完好…

Kafka反序列化RCE漏洞(CVE-2023-34040)

漏洞描述 Spring Kafka 是 Spring Framework 生态系统中的一个模块&#xff0c;用于简化在 Spring 应用程序中集成 Apache Kafka 的过程&#xff0c;记录 (record) 指 Kafka 消息中的一条记录。 受影响版本中默认未对记录配置 ErrorHandlingDeserializer&#xff0c;当用户将…

PSP - 蛋白质-核酸复合物结构预测 RoseTTAFoldNA 算法框架 (Protein-RNA、Protein-DNA、RNA)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/134208615 Paper: Accurate prediction of nucleic acid and protein-nucleic acid complexes using RoseTTAFoldNA GitHub: RoseTTAFold2NA 蛋白…

分享99个工作总结PPT,总有一款适合您

分享99个工作总结PPT&#xff0c;总有一款适合您 PPT下载链接&#xff1a;https://pan.baidu.com/s/1ETaGRUsTRRQq3i5PJUX7tA?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 黑金商务路演工作汇报PPT模板 古韵中国风财务计…

JavaSE java对象的比较

目录 1 问题提出2 元素的比较2.1 基本类型的比较2.2 对象的比较 3 对象的比较3.1 覆写基类的equal3.2 基于Comparble接口类的比较3.3 基于比较器比较3.4 三种方式对比 4 集合框架中PriorityQueue的比较方式5 总结 1 问题提出 上节课我们讲了优先级队列&#xff0c;优先级队列在…

汇编-字符串

字符串常量是用单引号或双引号括起来的一个字符序列 当以下面例子中的方式使用时&#xff0c;嵌入引号也是允许的&#xff1a; 正如字符常量以整数形式存放一样&#xff0c;字符串常量在内存中的存储形式为整数字节值的序列。例如&#xff0c; 字符串字面量“ABCD”包含四个字…

SPSS单样本K-S检验

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

第25期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练 Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

GEE:GEE中实现简单计算器

作者&#xff1a;CSDN _养乐多_ 本文记录了在 Google Earth Engine&#xff08;GEE&#xff09;上实现简单计算器的代码。 APP链接&#xff1a;https://949384116.users.earthengine.app/view/simplecalculator 文章目录 一、完整代码二、代码链接 一、完整代码 // 定义初始…

二十、泛型(1)

本章概要 基本概念 与 C 的比较 简单泛型 一个元组类库一个堆栈类RandomList 基本概念 普通的类和方法只能使用特定的类型&#xff1a;基本数据类型或类类型。如果编写的代码需要应用于多种类型&#xff0c;这种严苛的限制对代码的束缚就会很大。 多态是一种面向对象思想的泛…

预制构建生产管理系统

在建筑施工领域&#xff0c;预制构件的使用越来越广泛&#xff0c;它能够提高工程质量和施工效率&#xff0c;减少施工现场对环境的影响。通过凡尔码的二维码管理平台&#xff0c;系统从&#xff1a;生产过程、生产数据、生产计划、生产管理、成品交付等多个环节、工序和流程进…

mermaid学习第一天/更改主题颜色和边框颜色/《需求解释流程图》

mermaid 在线官网&#xff1a; https://mermaid-js.github.io/ 在线学习文件&#xff1a; https://mermaid.js.org/syntax/quadrantChart.html 1、今天主要是想做需求解释的流程图&#xff0c;又不想自己画&#xff0c;就用了&#xff0c;框框不能直接进行全局配置&#xff0…

如何助力机构单位提升运营效率?有什么靠谱的大数据管理平台?

随着数字化时代的到来&#xff0c;大数据管理平台已成为机构单位提高效率、优化资源配置的关键工具。其中&#xff0c;工单管理系统作为大数据管理平台的重要组成部分&#xff0c;对于机构单位运营的优化和提升具有举足轻重的地位。本文小编将为您介绍一款优秀的工单管理系统—…

Zygote进程通信为什么用Socket而不是Binder?

Zygote进程是Android系统中的一个特殊进程&#xff0c;它在系统启动时被创建&#xff0c;并负责孵化其他应用进程。它的主要作用是预加载和共享应用进程的资源&#xff0c;以提高应用启动的速度。 在Android系统中&#xff0c;常用的进程通信方式有以下几种&#xff1a; Intent…

概率论和数理统计(一)基本概念

前言 生活中对于事件的发生,可以概括为 确定现象&#xff1a;在一定条件下必然发生&#xff0c;如日出随机现象&#xff1a;在个别试验中其结果呈现出不确定性&#xff0c;在大量重复试验中其结果又具有统计规律的现象&#xff0c;称之为随机现象。 随机现象的特点&#xff…

独家分享 | BI零售数据分析模板,可视化,更易懂

“人、货、场”是零售数据分析的三大关键&#xff0c;只要能又快又透彻地掌握这三大关键的数据情况&#xff0c;即可为零售运营决策提供关键的数据支持&#xff0c;提高盈利、降低成本、优化采购库存结构等。奥威BI软件这套BI零售数据分析模板套装围绕“人、货、场”预设了数十…

低代码平台如火如荼,告诉我它具体能做什么?

目录 一、前言 二、低代码平台 三、低代码平台的优劣 四、低代码能解决哪些问题&#xff1f; 五、好用且强大的低代码平台 六、结语 一、前言 目前低代码平台如火如荼。这一新兴技术为企业提供了一种高效、灵活、快速开发应用程序的方法&#xff0c;并在短时间内取得了巨大成功…

游戏中找不到d3dx9_43.dll怎么办,教你快速解决方法

在计算机的世界里&#xff0c;我们经常会遇到一些让人头疼的问题。比如&#xff0c;有一天&#xff0c;小明正在玩他最喜欢的游戏&#xff0c;突然弹出了一个错误提示&#xff1a;“由于找不到d3dx9_43.dll,无法继续执行代码”。小明感到非常困惑&#xff0c;不知道这是什么意思…

【python VS vba】(5) 在python中使用xlwt操作Excel(待完善ing)

目录 1 什么是xlwt 2 导入xlwt 3 相关语法 3.1 创建新的workbook 3.2 创建新的sheet 3.3 保存workbook 4 python里表格的形式 4.1 矩阵 4.2 EXCEL的数据形式 完全等于矩阵的数字结构 4.3 python里矩阵 5 具体代码 5.1 代码 5.2 结果 5.3 要注意的问题 5.3.1 不能…