《互联网大厂Java面试大闯关:核心知识与实战应用》

49 阅读5分钟

面试官:第一轮提问开始。首先,说说Java中的多线程创建方式有哪些?

王铁牛:这个简单,有继承Thread类和实现Runnable接口这两种方式。

面试官:不错,回答正确。那再问一个,线程池有哪些核心参数?

王铁牛:线程池的核心参数有corePoolSize(核心线程数)、maximumPoolSize(最大线程数)、keepAliveTime(线程存活时间)、unit(时间单位)、workQueue(任务队列)、threadFactory(线程工厂)、handler(拒绝策略)。

面试官:嗯,回答得很全面。最后一个问题,简述一下HashMap的底层实现原理。

王铁牛:HashMap底层是数组+链表+红黑树的结构。当链表长度超过8且数组长度大于64时,链表会转换为红黑树。

面试官:好,第一轮提问结束。接下来进入第二轮。说说JVM的内存结构。

王铁牛:JVM内存结构包括堆、栈、方法区、程序计数器、本地方法栈。

面试官:那类加载机制有哪些?

王铁牛:类加载机制有加载、验证、准备、解析、初始化。

面试官:再问一个,简述Spring的核心特性。

王铁牛:Spring的核心特性有依赖注入、面向切面编程、IoC容器等。

面试官:第二轮提问完毕。现在进入第三轮。说说MyBatis的缓存机制。

王铁牛:MyBatis有一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,二级缓存是mapper级别的缓存。

面试官:那Dubbo的集群容错模式有哪些?

王铁牛:Dubbo的集群容错模式有failover(失败自动切换)、failfast(快速失败)、failsafe(失败安全)、failback(失败自动恢复)、forking(并行调用多个服务)等。

面试官:最后一个问题,简述RabbitMq的工作模式。

王铁牛:RabbitMq的工作模式有简单模式、工作队列模式、发布订阅模式、路由模式、主题模式等。

面试官:好,三轮提问都结束了。回家等通知吧。

答案:

  1. Java多线程创建方式
    • 继承Thread类:通过继承Thread类并重写run方法来创建线程。
    • 实现Runnable接口:实现Runnable接口的run方法,然后将其作为参数传递给Thread类的构造函数来创建线程。
  2. 线程池核心参数
    • corePoolSize:核心线程数,当提交的任务数小于corePoolSize时,线程池会创建新线程来执行任务。
    • maximumPoolSize:最大线程数,当提交的任务数大于corePoolSize且任务队列已满时,线程池会创建新线程直到线程数达到maximumPoolSize。
    • keepAliveTime:线程存活时间,当线程数大于corePoolSize时,多余的线程在空闲时会存活keepAliveTime这么长时间。
    • unit:时间单位,keepAliveTime的时间单位。
    • workQueue:任务队列,用于存放提交的任务。
    • threadFactory:线程工厂,用于创建线程。
    • handler:拒绝策略,当线程数达到maximumPoolSize且任务队列已满时,会调用handler来处理新提交的任务。
  3. HashMap底层实现原理
    • HashMap底层是数组+链表+红黑树的结构。
    • 初始化时,会创建一个长度为2的幂次方的数组。
    • 当插入键值对时,会通过键的hash值计算出在数组中的位置。
    • 如果该位置为空,则直接插入新节点。
    • 如果该位置不为空,则会遍历链表或红黑树,找到相同键的节点则更新其值,否则插入新节点。
    • 当链表长度超过8且数组长度大于64时,链表会转换为红黑树,以提高查询效率。
  4. JVM内存结构
    • :存放对象实例。
    • :存放局部变量、操作数栈、动态链接、方法出口等。
    • 方法区:存放类信息、常量、静态变量等。
    • 程序计数器:记录当前线程执行的字节码指令地址。
    • 本地方法栈:为本地方法服务。
  5. 类加载机制
    • 加载:将类的字节码文件加载到内存中。
    • 验证:验证字节码文件的正确性。
    • 准备:为类的静态变量分配内存并设置初始值。
    • 解析:将符号引用转换为直接引用。
    • 初始化:执行类的静态代码块和静态变量的赋值操作。
  6. Spring核心特性
    • 依赖注入:通过IoC容器将对象的依赖关系注入到对象中。
    • 面向切面编程:通过AOP实现横切关注点的模块化。
    • IoC容器:管理对象的生命周期和依赖关系。
  7. MyBatis缓存机制
    • 一级缓存:SqlSession级别的缓存,默认开启。在同一个SqlSession中,对相同数据的查询会从缓存中获取,不会再次查询数据库。
    • 二级缓存:mapper级别的缓存,需要手动开启。多个SqlSession可以共享二级缓存。
  8. Dubbo集群容错模式
    • failover:失败自动切换,当调用失败时,会自动重试其他服务。
    • failfast:快速失败,当调用失败时,立即返回错误,不进行重试。
    • failsafe:失败安全,当调用失败时,不抛出异常,直接忽略。
    • failback:失败自动恢复,当调用失败时,会将任务放入队列中,定时重试。
    • forking:并行调用多个服务,只要有一个成功就返回。
  9. RabbitMq工作模式
    • 简单模式:一个生产者,一个消费者,一条队列。
    • 工作队列模式:一个生产者,多个消费者,一条队列,消费者采用轮询的方式获取任务。
    • 发布订阅模式:一个生产者,多个消费者,多条队列,生产者将消息发送到交换机,交换机将消息发送到所有绑定的队列。
    • 路由模式:一个生产者,多个消费者,多条队列,生产者将消息发送到交换机,交换机根据路由键将消息发送到绑定的队列。
    • 主题模式:一个生产者,多个消费者,多条队列,生产者将消息发送到交换机,交换机根据主题将消息发送到绑定的队列。