Java数据结构*Map和 Set*

目录

1 搜索树

1.1 概念

1.2 二叉搜索树的查找

1.3二叉搜索树的插入

1.4 二叉树的删除

2 搜索

2.1 概念及场景

3 Map

3.1 关于Map.Entry

3.2 Map的常见方法说明

4 Set的说明

4.1 常见方法说明


1 搜索树

1.1 概念

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:

  • 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值

  • 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值

  • 它的左右子树也分别为二叉搜索树

1.2 二叉搜索树的查找

/** * 二叉搜索树的查找 * 时间复杂度 * 最好 O(logn) * 最坏O(n) */ public boolean search(int val) { TreeNode cur = root; while (cur != null) { if (cur.val < val) { cur = cur.right; }else if (cur.val == val) { return true; }else { cur = cur.left; } } return false; }
1.3二叉搜索树的插入

如果树为空树,即根 == null,直接插入

如果树不是空树,按照查找逻辑确定插入位置,插入新结点

/** * 二叉搜索树的插入 * @param val */ public void insert(int val) { TreeNode node = new TreeNode(val); if (root == null) { root = node; return ; } TreeNode cur = root; TreeNode parent = null; while (cur != null) { if (cur.val < val) { parent = cur; cur = cur.right; }else if (cur.val > val) { parent = cur; cur = cur.left; }else { return ; } } //根据父节点值判断插入左/右子节点 if (parent.val < val) { parent.right = node; }else { parent.left = node; } }
1.4 二叉树的删除

设待删除结点为 cur, 待删除结点的双亲结点为 parent

  1. cur.left == null

  • cur 是 root,则 root = cur.right

  • cur 不是 root,cur 是 parent.left,则 parent.left = cur.right

  • cur 不是 root,cur 是 parent.right,则 parent.right = cur.right

  1. cur.right == null

  • cur 是 root,则 root = cur.left

  • cur 不是 root,cur 是 parent.left,则 parent.left = cur.left

  • cur 不是 root,cur 是 parent.right,则 parent.right = cur.left

  1. cur.left != null && cur.right != null

需要使用替换法进行删除,即在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被 删除节点中,再来处理该结点的删除问题

/** * 二叉树的删除 * @param val */ public void remove(int val) { TreeNode cur = root; TreeNode parent = null; while (cur != null) { if (cur.val < val) { parent = cur; cur = cur.right; }else if(cur.val > val) { parent = cur; cur = cur.left; }else { removeNode(parent,cur); return ; } } } ​ private void removeNode(TreeNode parent, TreeNode cur) { if (cur.left == null) { if (cur == root) { root = cur.right; }if (parent.left == cur) { parent.left = cur.right; }else { parent.right = cur.right; } }else if (cur.right == null) { if (cur == root) { root = cur.left; }if (parent.left == cur) { parent.left = cur.right; }else { parent.right = cur.right; } }else { TreeNode target = cur.right; TreeNode targetParent = cur; while (target.left != null) { targetParent = target; target = target.left; } cur.val = target.val; if (target == targetParent.left) { targetParent.left = cur.right; }else { targetParent.right = cur.right; } } }

2 搜索

2.1 概念及场景

Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。以前常见的 搜索方式有:

  • 直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢

  • 二分查找,时间复杂度为 ,但搜索前必须要求序列是有序的

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

  • 根据姓名查询考试成绩

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

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

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

2.2 模型

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

  • 纯 key 模型,比如: 有一个英文词典,快速查找一个单词是否在词典中 快速查找某个名字在不在通讯录中

  • Key-Value 模型,比如: 统计文件中每个单词出现的次数,统计结果是每个单词都有与其对应的次数:<单词,单词出现的次数> 梁山好汉的江湖绰号:每个好汉都有自己的江湖绰号

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

参考:Map官方文档 https://docs.oracle.com/javase/8/docs/api/java/util/Map.html

3 Map

Map是一个接口类,该类没有继承自Collection,该类中存储的是结构的键值对,并且K一定是唯一的,不 能重复。

3.1 关于Map.Entry
方法解释
K getKey()返回entry中的key
V getValue()返回entry中的Value
V setValue(V value)将键值对中的value替换为指定value

Ps:Map.Entry并没有提供设置Key的方法

3.2 Map的常见方法说明
方法解释
V get(Object key)返回 key 对应的 value
V getOrDefault(Object key, V defaultValue)返回 key 对应的 value,key 不存在,返回默认值
V put(K key, V value)设置 key 对应的 value
V remove(Object key)删除 key 对应的映射关系
Set keySet()返回所有 key 的不重复集合
Collection values()返回所有 value 的可重复集合
Set<Map.Entry<K,V>> entrySet()返回所有的 key-value 映射关系
boolean containsKey(Object key)判断是否包含 key
boolean containsValue(Object value)判断是否包含 value

PS:

  • 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删除掉,然后再来进行 重新插入。

Map底层结构TreeMapHashMap
底层结构红黑树哈希桶
插入/删除/查找时间 复杂度O(log2N)O(1)
是否有序关于Key有序无序
线程安全不安全不安全
插入/删除/查找区别需要进行元素比较通过哈希函数计算哈希地址
比较与覆写key必须能够比较,否则会抛出 ClassCastException异常自定义类型需要覆写equals和 hashCode方法
应用场景需要Key有序场景下Key是否有序不关心,需要更高的 时间性能
public static void main2(String[] args) { //根据Key值 来判断大小 Map<String,Integer> map = new TreeMap<>(); map.put("hello",3); map.put("abcd",13); map.put("world",9); //System.out.println(map); ​ //这个是把map转换成了set Set<Map.Entry<String,Integer>> set = map.entrySet(); ​ for(Map.Entry<String,Integer> entry : set) { System.out.println("key: "+entry.getKey() +" val: "+entry.getValue()); } ​ //System.out.println(map.get("abcd")); //System.out.println(map.getOrDefault("abcd",0)); ​ /*Set<String> set = map.keySet(); System.out.println(set); ​ Collection<Integer> values = map.values(); System.out.println(values);*/ ​ /*Map<Student,Integer> map2 = new TreeMap<>(); map2.put(new Student(),10);*/ }

4 Set的说明

参考:Set 官方文档 https://docs.oracle.com/javase/8/docs/api/java/util/Set.html

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

4.1 常见方法说明
方法解释
boolean add(E e)添加元素,但重元素不会被添加成功
void clear()清空集合
boolean contains(Object o)判断 o 是否在集合中
Iterator 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<?extendsE> c)集合c中的元素添加到set中,可以达到去重的效果

PS:

  • Set是继承自Collection的一个接口类

  • Set中只存储了key,并且要求key一定要唯一

  • TreeSet的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的

  • Set最大的功能就是对集合中的元素进行去重

  • 实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础 上维护了一个双向链表来记录元素的插入次序。

  • Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入

  • TreeSet中不能插入null的key,HashSet可以。

Set底层结构TreeSetHashSet
底层结构红黑树哈希桶
插入/删除/查找时间 复杂度O(log2N)O(1)
是否有序关于Key有序不一定有序
线程安全不安全不安全
插入/删除/查找区别按照红黑树的特性来进行插入和删除1. 先计算key哈希地址 2. 然后进行 插入和删除
比较与覆写key必须能够比较,否则会抛出 ClassCastException异常自定义类型需要覆写equals和 hashCode方法
应用场景需要Key有序场景下Key是否有序不关心,需要更高的 时间性能
public static void main(String[] args) { Set<String> set = new TreeSet<>(); set.add("hello"); set.add("abcd"); //set.add("abcd"); set.add("world"); ​ Iterator<String> iterator = set.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } //System.out.println(set); ​ /*for(String s :set) { System.out.println(s); }*/ }

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

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

相关文章

Java毕设选题推荐:基于springboot的电子产品电子外设销售系统基于springboot的电子产品销售系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Java毕设选题推荐:基于springboot的动漫周边商城的设计与实现基于springboot的二次元商品商城系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

施耐德 KNX 系统赋能国家储能大厦:智能能源管理与 ESG 解决方案实践

国家储能大厦聚焦能源高效调度、节能管控、ESG 数据可追溯等需求&#xff0c;施耐德 KNX 系统深度融入储能与运维体系&#xff0c;构建智能管控平台&#xff0c;实现能耗降低与 ESG 目标落地&#xff0c;打造储能建筑与智能楼宇融合典范。一、KNX 系统在国家储能大厦中的核心角…

Java毕设项目推荐-基于springboot的二次元商品购物商城系统基于springboot的二次元商品商城系统【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

花 6888 元拿下 PMP证书!到底是报班还是自学?

作为一次性拿下 PMP 和 CSPM-4 两个证书的过来人&#xff0c;经常有学弟学妹问我&#xff1a;考 PMP 到底要不要报班&#xff1f;2988 元的培训费值不值&#xff1f;今天就以学长的身份&#xff0c;结合自己的备考经历&#xff0c;把这件事聊透&#xff0c;帮你少走弯路&#x…

导师严选2026 TOP8 AI论文写作软件:研究生开题报告神器测评

导师严选2026 TOP8 AI论文写作软件&#xff1a;研究生开题报告神器测评 2026年AI论文写作软件测评&#xff1a;为何值得一看 随着人工智能技术的不断进步&#xff0c;AI写作工具在学术领域的应用日益广泛。对于研究生而言&#xff0c;从开题报告到论文撰写&#xff0c;每一个环…

Java毕设项目推荐-基于SpringBoot+Vue的宠物咖啡馆平台管理系统基于springboot的宠物咖啡平台管理系统【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【计算机毕业设计案例】基于springboot的宠物咖啡平台管理系统基于SpringBoot+Vue的宠物咖啡馆平台管理系统(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【计算机毕业设计案例】基于springboot的电子产品电子外设销售系统基于SpringBoot + Vue的手机电脑相机电子产品销售系统(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【计算机毕业设计案例】基于springboot的二次元商品商城系统基于springboot的二次元商品购物商城系统(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

救命神器10个AI论文平台,本科生搞定毕业论文!

救命神器10个AI论文平台&#xff0c;本科生搞定毕业论文&#xff01; AI 工具如何成为论文写作的得力助手 随着人工智能技术的不断进步&#xff0c;越来越多的 AI 工具开始进入学术领域&#xff0c;为学生和研究人员提供高效、便捷的支持。尤其是在论文写作过程中&#xff0c…

清华公开课去哪儿看?北大公开课去哪儿看?抖音精选平台

当“知识普惠”从一个宏大的理念&#xff0c;落地为普通人指尖可触的屏幕时&#xff0c;最动人的故事便开始发生。近年来&#xff0c;一个越来越清晰的答案浮现出来&#xff1a;想要便捷地观看清华、北大的优质公开课&#xff0c;抖音精选已成为一个重要的窗口。这里不仅汇聚了…

清北公开课在哪里看

清华、北大公开课凭借顶尖师资、跨领域内容及深浅适中的讲解&#xff0c;成为大众补充知识、拓宽视野的优质选择。2026年教育数字化持续深化&#xff0c;多款平台汇聚了清北公开课资源&#xff0c;各有功能侧重与呈现形式。本文梳理8个观看平台&#xff0c;详细介绍其特点与使用…

AI驱动的技术栈演进建议:数据支持下的技术决策

AI驱动的技术栈演进建议:数据支持下的技术决策 关键词&#xff1a;AI驱动、技术栈演进、数据支持、技术决策、机器学习、数据分析 摘要&#xff1a;本文聚焦于AI驱动下技术栈的演进&#xff0c;深入探讨如何基于数据做出有效的技术决策。首先介绍了相关背景&#xff0c;包括目的…

Redis高级特性实战:从Bitmaps到位操作的应用场景

文章引言 提到Redis&#xff0c;大家脑海中浮现的可能是它作为高性能键值存储的经典形象&#xff1a;一个轻量、快速的内存数据库&#xff0c;完美胜任缓存、会话管理等场景。然而&#xff0c;Redis的魅力远不止于此。随着版本迭代&#xff0c;它从最初的简单键值对工具&#…

计算机Java毕设实战-基于springboot的电子商品销售系统电子产品电子外设销售系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

计算机Java毕设实战-基于Springboot+Vue的动漫周边商场系统基于springboot的二次元商品商城系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Java计算机毕设之基于springboot的二次元商品商城系统基于SpringBoot与Vue的动漫周边商场系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Ollama 学习与使用指南 (Windows Linux 版)

什么是 Ollama? Ollama 是一个开源工具,让你能够轻松地在本地(Windows, Linux)下载、运行和管理大型语言模型(LLMs),如 Llama 3, Qwen (通义千问), Mistral 等。它将模型权重、运行环境自动封装,让你像使用 Do…

【Da】交付面板

--本篇导航--导出视频1080P转4K导出导出部分片段导出透明视频打包、工程、数据库导出有色差导出视频1080P转4K导出 需要先把项目设置改成4K分辨率进行采样,之后再交付导出。导出部分片段 可在时间线上选择导出选择的片…