1.什么是红黑树?你为什么选择用红黑树?能不能为我讲解一下该算法的原理?
    什么是红黑树?

    • 红黑树是一个含有红黑结点并能自平衡的二叉查找树,它的黑色结点完美平衡,可以视为一个2-3-4树的变体。

    使用红黑树的原因?

    • 离散事件仿真中会有一个事件表,用于存放等待调度的事件,这些事件会按照时间排序。不断有新的事件加入,同时也有时间最小的时间被执行(删除)。(也就是说这需要一个插入和删除操作都非常频繁的,有序的,数据结构)
    • 红黑树能够自平衡,可以避像普通二叉查找树一样退化成链表。同时插入和删除频繁的操作也适合使用红黑树。

    红黑树的原理:
    红黑树是一个2-3-4树的变体,我们可以借助2-3-4树,来帮助解释红黑树的插入和删除操作。

    • 2-3-4树中的2结点 对应 红黑树中的一个黑结点
    • 2-3-4树中的3结点 对应 红黑树中的2个结点构成的上黑下红结构,可以是左倾,也可以是右倾
    • 2-3-4数中的4结点 对应 红黑树中的3个节点构成的上黑左右子节点为红的结构

    红黑树的插入操作(简单介绍):

    1. 当插入节点的父结点是黑色时,直接插入。(对应着2-3-4树中向2结点合并一个新元素,变成3结点)
    2. 当插入节点的父结点为红色,叔叔结点也为红色时,父结点和叔叔结点同时变黑,祖父变红,将祖父结点视为插入节点,继续递归(对应着2-3-4树中,向4结点合并一个新元素,导致4结点裂变成2结点 + 3结点 + 原4结点的中间元素升元)
    3. 当插入节点的父结点为红色,叔叔结点为空或者为黑是,分2种情况:
      1. 若插入结点,父亲结点,祖父结点,在同一条线上,则围绕着祖父结点旋转,再进行变色
      2. 若插入结点,父亲结点,祖父结点,不在同一条直线,则先绕父亲结点旋转成同一条直线,再进行i操作
      3. 对应着(2-3-4树中,向3结点合并一个新元素,变成4结点)

    红黑树的删除操作(简单介绍):
    删除操作等价于找到删除结点的代替结点,用代替结点的值替换删除结点的值,再删除代替结点
    删除操作比较复杂,简单介绍一下原理:
    情况1:删除后自己能平衡的就自己解决(要么是删除红色叶子节点,直接删除;要么删除的是只有一个红色叶子节点的黑色结点,用叶子节点去代替它,并变成黑色)。
    情况2:若自己不能平衡,兄弟结点有结点可借,则父亲结点下来,兄弟结点中选一个当做父亲结点
    情况3:若自己不能平衡,兄弟也没有结点可借,则将兄弟结点变成红色,此时若父结点为红色,则将父结点变成黑色,使左右子树都平衡,若父亲结点为黑色,则祖父结点少的这一侧少了一层,将父亲结点当做代替结点,递归的向上处理。

    1. 什么是命令模式?讲讲是如何在开发中应用的。

    命令模式将调用请求的对象和执行请求的对象解耦,它们之间通过一个命令对象进行沟通,命令对象封装了接受者和一组动作。
    事件表中的事件就是由执行时间和一个命令对象构成的,这个命令对象打包了一个模型组件对象和它将要执行的操作。这样我们就可以将调度器和真正执行操作的组件之间解耦,将操作加入到一个工作队列中被排序,在指定的时候被调度执行。

    1. 在你的学习过程中,不管是在Java语言还是各种框架中,你见过多少种设计模式?可以介绍一下吗?

    模版方法模式:模版方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。它是一个代码复用的重要技术。
    迭代器模式:提供 一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。

    1. 什么是离散事件仿真?

    离散事件仿真是一种程序性的系统观,它强调的是物件进入系统之后一连串的遭遇,(例如生产线上的原料或半成品),多数情况下,这些物件的处理过程都会使用到资源,(例如,工具,劳工,机器设备),而事件是指改变系统状态的事情(例如顾客到达与离开,资源占用或者释放)

    1. 你在开发这个离散事件仿真系统的时候,遇到过什么技术上的难点,你又是怎么克服的呢?

    刚开始学习开源项目时,不理解调度器是如何执行事件的,

    • 快速的看完了Head First 设计模式,然后就发现项目中比较隐秘地使用了命令模式,问题得以解决
    • 通过debug 和 查看项目生成的类图 来确定项目核心部分的代码。

    对于项目中一些代码不是很理解。

    • 向项目的维护者发邮件寻求帮助。
    • 阅读开发手册,查找论坛的讨论历史,debug

    在二次开发过程中出现了很多问题

    • 编写测试用例 + debug
    1. Springboot相关问题,起步依赖,和Spring的区别,自动配置,IOC,AOP等一系列问题

    ioc控制反转是一种设计思想,就是原本需要手动创建对象并销毁,现在则交由spring框架来管理,然后把对象之间的依赖关系交给ioc容器,并由ioc容器完成对象的注入,这样可以很大程序的简化应用的开发,把应用从复杂的依赖关系中解放出来。ioc容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好注解就行,完全不用考虑对象是如何被创建的。

    aop面向切面编程,可以将那些与业务无关,却为业务模块所共同调用的逻辑或责任,如事务管理、日志管理、权限控制等 封装起来,便于减少系统的重复代码,降低模块之间的耦合,并有利于项目的扩展和维护

    1. 为什么要使用webSocket?和http有什么区别?

    因为投票的业务场景,需要即时显示投票的数据的变化,用户较多的时候,轮询可能不太合适

    WebSocker 是双向的使用的全双工协议,与HTTP不同,它以ws://wss://开头。它是一个有状态协议,这意味着客户端和服务器之间的连接将保持活动状态,直到被任何一方终止。在通过客户端和服务器中的任何一方关闭连接之后,连接将从两端终止。

    1. 描述一下如何使用nginx反向代理解决跨域问题、

    通过反向代理隐藏服务端,设置相应的location以拦截前端需要跨域的请求,最后将请求代理回后端服务器**

    ORM N + 1
    1+n是执行一次查询获取n条主数据后,由于关联引起的执行n次查询从数据;它带来了性能问题;一般来说,通过懒加载 可以部分缓解1+n带来的性能问题

    多线程,线程池,

    垃圾算法

    tcp/ip 网络协议

    java网络编程

    你有什么问题要问我吗?

    工作氛围怎么样?

    业务细节,

    面试结果