【Java从头开始到光头结束】No7.回顾Map集合基础与树形数据结构

Map集合基础与树形数据结构

基础回顾 → Map集合基础与树形数据结构
————————————————————————————————————
文章部分内容选自书本《码出高效:Java开发手册》

1.Map集合基础

之前的博客中已经对List集合中的ArrayList及LinkedList有过源码的大致分析和学习拓展,今天这篇博文主要是Map集合的一个铺垫(因为是回顾,所以不会有很基础的概念),之后我们会对Map集合中的常用实现类进行源码分析和学习。附上之前博客的链接:
【Java从头开始到光头结束】No4.JDK1.8 ArrayList源码学习及扩展
【Java从头开始到光头结束】No5.JDK1.8 LinkedList源码学习

下来看一下Java中的集合框架图,Map集合只是其中的一部分,但是也是非常重要的一部分。
在这里插入图片描述书上说的非常好,“程序 = 数据结构 + 算法”集合作为数据结构的载体,可对元素进行加工和输出,以一定的算法实现最基本的增删改查功能,因此集合是所有编程语言的基础。
所以我们先简单回顾一下数据结构的知识,我把书上的内容做一下总结和概括:

  1. 数据结构定义
    数据结构是指逻辑意义上数据组织方式及其相应的处理方式
    1-1.什么是 逻辑意义
    数据结构的抽象表达非常丰富,而实际物理存储的方式相对单一。树结构在在磁盘上的存储肯定不是树形排列吧,这种树结构的存储模型就是一个逻辑意义上的结构模型,和实际的物理存储方式截然不同(当然也有符合物理存储模型的数据结构,例如底层的数组结构,就是连续的内存存储空间)
    1-2.什么是 数据组织 方式?
    逻辑意义上的组织方式有很多,比如树、图、队列、哈希等。树可以是二叉树、三叉树、 B+树等,图可以是有向图或无向图,队列是先进先出的线性结构;哈希是根据某种算法直接定位的数据组织方式。(总的来说就是对数据进行有效的组织排列,方式多重多样,适应的场景也是五花八门)
    1-3.什么是 数据处理 方式?
    在既定的数据组织方式上,以某种特定的算法实现数据的增删改查和遍历。不同的数据处理方式往往存在着非常大的性能差异。

  2. 数据结构分类
    数据结构是算法实现的基石,它是一种体现基础逻辑思维的内功心法,也是计算机从业人员能力图谱中的重要一项。如果完全不懂数据结构,很难写出优秀的代码。有缺陷的底层数据结构容易导致系统风险高、可扩展性差,所以需要认真地对数据结构进行设计和评审。从直接前继和直接后继个数的维度来看,大体可以将数据结构分为以下四类。
    2-1. 线性结构
    0至1个直接前继和直接后继。当线性结构非空时,有唯一的首元素和尾元素,除两者外,所有的元素都有唯一的直接前继和直接后继。线性结构包括顺序表、链表、栈、队列等,其中栈和队列是访问受限的结构。栈是后进先出,即 Last In,First-Out ,简称 LIFO ;队列是先进先出 ,即 First-In,First-Out ,简称FIFO。
    2-2. 树结构
    0至1个直接前继和0至n个直接后继(n大于或等于2)。树是一种非常重要的有层次的非线性数据结构,像自然界的树一样。由于树结构比较稳定和均衡,在计算机领域中得到广泛应用。
    2-3. 图结构
    0至n个直接前继和直接后继(n大于或等于2)。图结构包括简单图、多重图、有向图和无向图等。(这个在Java存储结构中好像没有对应的实现)
    2-4. 哈希结构
    没有直接前继和直接后继。哈希结构通过某种特定的哈希函数,将索引与存储的值关联起来 它是一种查找效率非常高的数据结构。这也是我们Map集合中最常用到的数据结构。

数据结构如果只是结构的不同,那将毫无意义,这些特定的结构一定是为实现某种高效的算法服务的,只有二者相互结合才能发挥出威力,下来直接上书上的关于数据和时间复杂度的内容,感觉写的太好我无法再简化概括了:
在这里插入图片描述在这里插入图片描述
下来再看一下关于Map集合的总结说明:
在这里插入图片描述在这里插入图片描述Map 接口除提供传统的增删改查方式外,还有三个 Map 类特有的方法,即返回所有的key,返回所有的 Value 返回所有的 KV 键值对。源码加注释如下:

// 返回 Map 类对象中的 Key 的 Set 视图
Set<K> keySet(); 

// 返回 Map 类对象中的所有 Value 集合的 Collection 视图
// 返回的集合实现类为 Values extends AbstractCollection<V>
Collection<V> values();

// 返回 Map 类对象中的Key-Value键值对(Entry<K,V>)的 Set 视图
Set<Map.Entry<K, V>> entrySet();

通常这些返回的视图是支持清除操作的, 但是修改和增加元素会抛出异常,因为AbstractCollection 没有实现 add 操作,但是实现了 remove,clear 等相关操作。所以在使用这些视图返回集合时,注意不要操作此类相关方法。是否将 KV 设置为 null,以实现类约束为准,这是一个十分难以记忆的知识点:
在这里插入图片描述在这里插入图片描述

2.简述树形数据结构

上边我们看到了有多种数据结构的实现,为什么偏偏要说一下树形数据结构呢,主要还是因为树形结构在计算机领域的广泛应用,最重要的是咱们今天的主题,Java中的Map集合的底层代码实现原理,就是建立在树基础上的,Java的树底层是实现了红黑树,但是了解树结构的发展也是很有必要的,下来我们一起来看一下,这里只是我看完书上内容之后自己做总结,只是大致谈一谈,书上讲的更加详细,也更难,有兴趣的朋友我这里还是建议去阅读原文。
好了我们正式开始:
前排先推荐大家一个网站,这个网站是模拟我们数据结构的,有各种各样的数据结构都可以,点击进去之后是可视化的界面,往里边add数据就可以直观的看到数据结构的反应结果。

Data Structure Visualization加粗样式

  1. 树结构 → 二叉树结构
    计算机数据结构中的树是倒立过来的(图左),由于树的分支和节点杂乱无章,我们无法有效的对此存储数据结构进行好的维护使用,伴随着高效的二分查找法,诞生了我们的二叉树结构,每一个节点上最多有两个子节点(图右)
    在这里插入图片描述

  2. 平衡二叉树
    如果树的生长只偏向于一边,那么树就跑偏了,我们的数据结构也会跑偏,极端情况下如下图左,变成了一个链表,失去了作为树的意义,也失去了树结构的优秀数据处理方式,这无疑是一种浪费,所以为了使树结构发挥出功效,我们稍加限制,使得树左右节点恢复平衡,如图右,我们限制左右子树的高度差,得到平衡二叉树。
    在这里插入图片描述

  3. 二叉查找树
    又叫二叉搜寻树,即BST → Binary Search Tree,也叫二叉排序树BST → Binary Sort Tree
    其实树发展到这里还没有发挥二分查找法的威力,二分查找法的重要前提就是数据有序,
    此时二叉查找树要求它的左子树上所有节点的值都小于它,而它的右子树上所有节点的值都大于它。
    平衡二叉树的左图就可以将其转化为 二叉查找树,如下图
    在这里插入图片描述
    这里二叉查找树也有之前平衡二叉树的问题,就是随着树的生长,数据的增多,容易导致树跑偏失衡,所以为了保持平衡性,后边又出来了很多树,例如AVL 树、红黑树、 SBT( Size Balanced Tree、Treap( 树堆)等。下边我们主要看一下AVL 树和红黑树。

  4. AVL 树
    AVL 树算法是以苏联数学家 Adelson-Velsky 和 Landis 名字命名的平衡二叉树算法,可以使二叉树的使用效率最大化。AVL 树是一种平衡二叉查找树(结合了平衡二叉树和二叉查找树),增加和删除节点后通过树形旋转重新达到平衡。一般分为左旋和右旋
    在这里插入图片描述在这里插入图片描述

  5. 红黑树
    红黑树和AVL树类似,也是平衡二叉查找树,相同点是都是在增加和删除节点后通过树形旋转重新达到平衡。不同点是,首先,红黑树对节点增加了颜色的属性,目的当然是为了通过节点颜色判断来提升数据结构计算和使用的速度,第二点就是红黑树是平衡树没错,但是他不是AVL树那种保持着绝对平衡,左右子树高度差不能超过1,红黑树是左右子树最长高度不得超过另一子树最长高度的两倍,就是左子树高度为3,右子树高度为6,在红黑树中是没有问题的。
    红黑树与 AVL 树的比较,直接上书上的内容
    在这里插入图片描述在这里插入图片描述深入的内容更多更复杂,这里就先简单介绍到这,我也只是回顾内容,不是初学这块内容,如果大家还有问题,我依旧还是建议去阅读原书本内容,将的比较详细,书的名字在文章一开始给出了。
    不了解这些数据结构内容的话,对我们阅读Map集合底层实现源码是一个很大的障碍,因为他很多源码写来写去就是实现了红黑树,红黑树的数据结构操作就像是一个说明书,药方,代码只是按照药方拿到的药而已。
    OK,我们下次Map源码学习的时候再见。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值