思路 这题我使用了两种解法 遍历N叉树 首先分析题目得知,该数据结构是N叉树,需要的是所有叶子节点 迭代器惰性求值 从时间复杂度的角度来看,遍历N叉树为O(N),遍历了所有节点,但我们是不需要非叶子节点的,不过要得到叶子结点,不得不遍历非叶子结点,所以没有提升空间了。 从空间复杂度的角度来看,提前遍历出所有叶子结点放到数组里,这里就可以优化。优化方…
什么是微服务 微服务是2014年提出的概念 微服务是一种架构风格 一个应用拆分为一组小型服务 每个服务运行在自己的进程内,也就是可独立部署和升级 服务之间使用轻量级HTTP交互 服务围绕业务功能拆分 可以由全自动部署机制独立部署 去中心化,服务自治。服务可以使用不同的语言、不同的存储技术 什么是SpringCloud 分布式微服务架构的一站式解决方…
接口隔离原则 定义 Interface Segregation Principle:客户端不应该被强迫依赖它不需要的接口。 个人理解 两个类之间的依赖应当建立在最小的接口上。接口颗粒度把握好,太小了调用麻烦,太大了就会提供一些客户端不需要的内容,服务端改动时影响范围增大,影响扩展性。 如果接口部分内容需要复用,可以拆出来,再使用外观模式,提供客户端…
依赖倒置原则 定义 高层模块不要依赖低层模块,应该通过抽象来互相依赖。除此之外,抽象不要依赖具体实现细节,具体实现细节依赖抽象。 个人理解 避免对具体实现类的直接引用,使其付出更小的代价达到扩展的目的,与开闭原则照应。 缺点也是老生常谈的类文件数量增加,可维护性下降。所以要在适当场景使用,切勿过度设计。例如service层定义接口,实际项目中,大部…
里式替换原则 定义 Liskov Substitution Principle:子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏。 个人理解 能够替换不只是从语法(多态)角度考虑,还需要保证替换后,原有业务逻辑正确。 LSP的意义 改进已有实现 例如程序最开始实现时采用了低效的排序算法,改进时使用LSP实…
开闭原则 定义 英文全称是Open Closed Principle,软件实体(模块、类、方法等)应该“对扩展 开放、对修改关闭”。 个人理解 在设计阶段,需要识别出哪些是不变的,哪些将来有可能改变的,留好扩展点。 寻找共性,进行抽象。通用的抽取封装到基类,同类型的、需要扩展的抽取为抽象方法。 如何理解“对扩展开放、对修改关闭”? 添加一个新的功能…
单一职责原则 定义 单一职责原则的英文是 Single Responsibility Principle,缩写为 SRP。一个类或者模块只负责完成一个职责(或者功能)。 如何理解单一职责原则(SRP)? 一个类只负责完成一个职责或者功能。不要设计大而全的类,要设计粒度小、功能单一的 类。单一职责原则是为了实现代码高内聚、低耦合,提高代码的复用性、可…
第一章、JVM和Java体系架构 JVM整体结构 方法区和堆是线程共享的 Java栈、本地方法栈、程序计数器是线程独享的 执行引擎包含解释器、即时编译器、垃圾回收器 Java代码执行流程 JVM架构模型 Java编译器输入的指令流是基于栈的指令集架构 基于栈的指令集架构 实现简单 不依赖于硬件,可移植性强 使用零地址指令分配方式,就是指令中没有操作…
Iterator Design Partern 作用 遍历容器实现复杂,并且方式有多种,例如遍历二叉树时,有前序、后序、中序遍历。将遍历容器从容器中独立出来,让两者的职责更单一。 容器使用的是迭代器接口,基于接口而非实现编程,替换迭代器更加容易。 示例 public class MyArrayList<E> implements Lis…
思路 首先二叉搜索树需要中序遍历,但如果是中序遍历,计算前面节点依赖于后面节点的结果。所以将中序遍历倒过来即可。 二叉树的遍历不止3种,可以自行调整。 题目 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.va…