Java面试-杂项-基础


  • 设计模式
    • 单例模式:private 修饰构造方法避免了类在外部被实例化
      • 饿汉模式:静态属性
      • 懒汉模式:双重校验锁;内部静态类
    • 装饰器模式:InputStream
    • 代理模式:静态代理;动态代理(JDK,cglib,spring aop)
    • 外观模式,观察者模式,原型模式,适配器模式,桥接模式,组合模式,享元模式
  • IO:同步阻塞 IO,在进行读写时,该线程将被阻塞,线程无法进行其它操作; IO 是面向流的
  • NIO:同步非阻塞 IO;NIO 是面向缓冲区的
    • 工作流程:读写数据是通过缓冲区 buffer 来读写
      1. 一个客户端会对应一个 channel,然后多路复用器 selector 会轮询(监控) channel (多路复用)
      2. 然后当有请求过来的时候,selector 才会去创建工作线程与 buffer
      3. 工作线程会通过 buffer 从 channel 中读取请求并进行处理
      4. 然后处理完成后再通过 buffer 将数据返回给 channel,当请求读写完成后会释放这个线程
    • Channel(通道):是双向的,既可以用来进行读操作,又可以用来进行写操作
      • Connect:客户端连接成功;Accept:准备好进行连接;Read:可读;Write:可写
    • Buffer(缓冲区):ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer
    • Selector(选择器):可以注册多个通道使用一个选择器
    • 基于低层选择器的调用(选择器在用户空间),调用 Linux 内核的 epoll 框架,epoll 框架会将就绪的 socket 连接添加进就绪列表。供选择器调用
    • IO 多路复用:一个线程(Java中的 Selector)不断去轮询多个 socket 的状态,只有当 socket 真正有读写事件时,才真正调用实际的 IO 读写操作
      • 指的是一个进程/线程可以监视多个文件描述符(在 Linux 低层,把一个网络连接叫做一个文件描述符)
      • 一个选择器只需要由1个线程监听即可。换句话说,我们可以用1个线程,通过选择器来管理多个通道
      • 实现 IO 多路复用,实际上就是把多个通道注册到选择器中,再由内核通过回调函数通知选择器,这些注册的通道,哪个通道具有已经就绪的 IO 事件(例如:可读,可写,网络连接完成等)
  • AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制
  • 序列化:Serializable,Hessian(支持动态类型、跨语言、基于对象传输的网络协议),Json
    • transient:避免将此属性序列化
  • @Transactional
    • 事务开始时,通过AOP机制,生成一个代理 connection 对象
      • 不使用该 connection 连接数据库执行的数据库命令,在本事务回滚的时候得不到回滚
  • Throwable 有两个子类,Error 和 Exception
    • Error:定义了在通常环境下不希望被程序捕获的异常。Error 类型的异常用于 Java 运行时由系统显示与运行时系统本身有关的错误。比如堆栈溢出错误
    • Exception 又分为运行时异常和非运行时异常
      • 运行时异常:一般由程序逻辑错误引起,比如 NullPointerException
      • 非运行时异常:必须进行处理的异常,如果不处理,程序就不能编译通过,比如 IOException
  • protected 修饰,同包可访问;default (无修饰符),同包可访问
  • 红黑树的特性:
    • 节点颜色:每个节点或者是黑色,或者是红色
    • 根节点颜色:根节点是黑色
    • 空节点为黑:每个叶子节点(NIL)是黑色。 注意:这里的叶子节点,是指为空(NIL或NULL)的叶子节点!
    • 红色节点规则:如果一个节点是红色的,则它的子节点必须是黑色的
    • 黑高一致性:从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点
  • 红黑树插入:当插入一个新节点时,首先按照二叉搜索树的性质插入这个节点,并将这个新节点着色为红色。之所以选择红色,是因为在维持树的平衡的同时,选择红色会导致更少的违反规则的情况
    • 如果新节点是根节点,直接将它变为黑色
    • 如果新节点的父节点是黑色,不需要做任何调整
    • 如果新节点的父节点是红色,可能会违反红黑树的规则。在这种情况下,需要检查叔叔节点(父节点的兄弟)的颜色
      • 叔叔节点是红色:将父节点和叔叔节点变为黑色,将祖父节点变为红色,然后将祖父节点作为新的检查点继续处理
      • 叔叔节点是黑色:可能需要进行一次或两次旋转。你需要根据父节点和新节点的位置关系来进行左旋或右旋以达到平衡(LL、LR、RL、RR形态)
  • 红黑树删除
    • 查找并删除:首先,找到要删除的节点。如果节点有两个孩子节点,通常会使用后继节点(中序遍历的下一个节点)或前驱节点(中序遍历的前一个节点)来替换,然后将问题转化为删除一个有0个或1个孩子的节点
    • 替换并保持颜色:如果被删除的节点有一个孩子节点,用孩子节点替换该节点,并保持原来的颜色。如果被删除的节点是红色,直接删除即可。但如果是黑色,我们可能会破坏红黑树的性质,尤其是黑高一致性的规则
    • 调整:如果是删除了一个黑色节点,可能需要调整树,以保持红黑树的性质。这可能涉及多次颜色变化和旋转。重要的是,这些调整能够在有限的步骤内完成,保证了删除操作的时间复杂度为 O(log n)

文章作者: 钱不寒
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 钱不寒 !
  目录