《互联网大厂Java面试:核心知识大考验》

30 阅读5分钟

互联网大厂Java面试:核心知识大考验

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

王铁牛:嗯,有继承Thread类,还有实现Runnable接口。

面试官:不错,回答正确。那说说线程池的几个核心参数及其作用。

王铁牛:核心线程数、最大线程数、队列容量、存活时间、时间单位,还有拒绝策略。核心线程数就是一开始线程池里的线程数量,最大线程数就是线程池能容纳的最大线程数量,队列容量就是存放任务的队列大小,存活时间和时间单位是当线程空闲多久后销毁,拒绝策略就是当线程池满了且队列也满了时怎么处理新任务。

面试官:回答得挺清晰。再问个,HashMap在JDK1.7和JDK1.8中有哪些不同?

王铁牛:这个,嗯,1.7是数组加链表,1.8是数组加链表再加红黑树。

面试官:好,第一轮面试结束。

面试官:现在进入第二轮。说说Spring的核心特性有哪些?

王铁牛:依赖注入、面向切面编程。

面试官:那Spring Boot的自动配置原理是什么?

王铁牛:就是根据类路径下的jar包、类、配置文件等来自动配置Bean。

面试官:MyBatis的#{}和${}的区别是什么?

王铁牛:#{}是预编译处理,${}是字符串替换,#{}能防止SQL注入。

面试官:第二轮面试结束。

面试官:最后一轮。Dubbo的集群容错策略有哪些?

王铁牛:有失败重试、快速失败、失败告警、集群容错、广播调用。

面试官:RabbitMq的消息确认机制了解吗?

王铁牛:嗯,有发送确认和接收确认。

面试官:xxl-job的执行器类型有哪些?

王铁牛:有单机执行器、集群执行器。

面试官:好,面试结束,回去等通知吧。

答案详解

  • 多线程创建方式
    • 继承Thread类:通过继承Thread类并重写其run方法来定义线程执行体。优点是编写简单,缺点是Java是单继承,继承了Thread类就不能再继承其他类了。
    • 实现Runnable接口:实现Runnable接口的run方法,将该实现类的实例作为参数传递给Thread类的构造函数来创建线程。好处是可以避免单继承的局限,方便多个线程共享资源。
  • 线程池核心参数及其作用
    • 核心线程数:线程池创建时初始化的线程数量,当提交的任务数小于核心线程数时,线程池会创建新线程来执行任务。
    • 最大线程数:线程池能够容纳的最大线程数量,当任务数超过核心线程数且队列已满时,会创建新线程直到达到最大线程数。
    • 队列容量:用于存放任务的队列,当任务数超过核心线程数时,任务会被放入队列中等待执行。
    • 存活时间:当线程空闲超过指定的存活时间后,会被销毁。
    • 时间单位:存活时间的单位。
    • 拒绝策略:当线程池满了且队列也满了时,对新提交任务的处理策略,比如AbortPolicy直接抛出异常,CallerRunsPolicy由调用者线程处理任务等。
  • HashMap在JDK1.7和JDK1.8中的不同
    • 数据结构:1.7是数组加链表,1.8是数组加链表再加红黑树。1.7中当链表长度超过8时会将链表转换为红黑树,1.8中当链表长度超过8且数组容量大于等于64时才会转换为红黑树。
    • 扩容机制:1.7扩容时需要重新计算每个元素的哈希值并重新插入,1.8扩容时会保留原链表的顺序,部分节点直接插入新位置,部分节点需要从原位置遍历到新位置。
  • Spring的核心特性
    • 依赖注入:通过控制反转(IoC)实现,将对象的创建和依赖关系的管理交给Spring容器,降低了组件之间的耦合度。
    • 面向切面编程(AOP):通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态添加功能,比如日志记录、事务管理等。
  • Spring Boot的自动配置原理:Spring Boot会根据类路径下的jar包、类、配置文件等来自动配置Bean。它通过@EnableAutoConfiguration注解开启自动配置功能,会导入大量的自动配置类,这些自动配置类会根据条件判断来决定是否配置某个Bean。比如当类路径下有DataSource相关的jar包时,就会自动配置数据源相关的Bean。
  • MyBatis的#{}和${}的区别
    • #{}:是预编译处理,会将参数作为占位符,在SQL执行前会对参数进行安全检查和类型转换,能有效防止SQL注入。
    • ${}:是字符串替换,会直接将参数的值替换到SQL中,不会进行安全检查和类型转换,使用不当可能导致SQL注入。
  • Dubbo的集群容错策略
    • 失败重试:失败后重新调用远程服务,适用于读操作等对一致性要求不高的场景。
    • 快速失败:一旦调用失败,立即返回错误,适用于对业务结果要求严格的场景。
    • 失败告警:调用失败后发送告警通知。
    • 集群容错:从多个可用服务中选择一个调用。
    • 广播调用:对所有提供者进行调用,逐个调用并汇总结果。
  • RabbitMq的消息确认机制
    • 发送确认:生产者将消息发送到RabbitMQ后,通过确认机制可以知道消息是否成功到达Broker。可以通过设置confirmCallback来监听确认结果。
    • 接收确认:消费者接收消息后,通过手动确认或自动确认机制告知RabbitMQ消息已被消费。手动确认可以更好地控制消息的消费流程。
  • xxl-job的执行器类型
    • 单机执行器:适用于单机部署的场景,所有任务在一台机器上执行。
    • 集群执行器:适用于集群部署的场景,任务可以在集群中的不同机器上执行,通过调度中心进行任务分配和管理。