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

42 阅读5分钟

面试官:第一轮面试开始,首先问你,简述一下Java中的多线程原理。

王铁牛:这个简单,多线程就是可以同时执行多个任务嘛。一个程序里可以有多个线程同时跑,互不干扰。

面试官:还算回答得清晰。那再问你,线程池有哪些参数,分别有什么作用?

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

面试官:不错,回答得挺全面。最后一个问题,说说HashMap的底层数据结构。

王铁牛:HashMap底层是数组加链表,后来链表长度超过8会转成红黑树。

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

面试官:第二轮面试,讲讲JVM的内存结构。

王铁牛:JVM内存结构包括堆、栈、方法区、程序计数器、本地方法栈。堆是存放对象的地方,栈是存放局部变量等,方法区存类信息等。

面试官:嗯,有一定了解。那说说Spring的核心特性。

王铁牛:Spring能做依赖注入、面向切面编程,还有IoC容器。

面试官:最后一个问题,Spring Boot和传统Spring相比有哪些优势?

王铁牛:Spring Boot更简单,自动配置,能快速搭建项目。

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

面试官:第三轮面试,说一下MyBatis的工作原理。

王铁牛:就是通过XML配置或者注解,把SQL语句和Java对象映射起来。

面试官:那Dubbo的服务调用流程是怎样的?

王铁牛:服务提供者暴露服务,注册到注册中心,服务消费者从注册中心获取服务列表,然后进行远程调用。

面试官:最后一个问题,RabbitMq如何保证消息不丢失?

王铁牛:这个嘛,发送端确认机制,持久化消息,消费端ACK等。

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

答案

  1. Java多线程原理:Java中的多线程是指在一个程序中可以同时执行多个任务。通过Thread类或其子类创建线程对象,调用start()方法启动线程。每个线程都有自己的执行栈和程序计数器,它们可以共享进程的资源。多线程可以提高程序的并发性能,但也需要注意线程安全问题。
  2. 线程池参数及作用
    • corePoolSize:核心线程数,当提交的任务数小于corePoolSize时,线程池会创建新线程来执行任务。
    • maximumPoolSize:最大线程数,当提交的任务数大于corePoolSize且任务队列已满时,会创建新线程直到线程数达到maximumPoolSize。
    • keepAliveTime:线程空闲时的存活时间。
    • unit:keepAliveTime的时间单位。
    • workQueue:任务队列,用于存放提交的任务。
    • threadFactory:线程工厂,用于创建线程。
    • handler:拒绝策略,当线程数达到maximumPoolSize且任务队列已满时,会调用handler来处理新提交的任务。
  3. HashMap底层数据结构:HashMap底层是数组加链表,后来链表长度超过8会转成红黑树。数组的每个元素是一个链表节点,链表节点包含键值对和指向下一个节点的引用。当插入新节点时,如果链表长度小于8,会直接插入链表尾部;如果链表长度大于等于8且数组容量大于等于64,会将链表转成红黑树,以提高查找效率。
  4. JVM内存结构
    • 堆:存放对象实例,是JVM中最大的一块内存区域。
    • 栈:存放局部变量、方法调用等信息。
    • 方法区:存储类信息、常量、静态变量等。
    • 程序计数器:记录当前线程执行的字节码指令地址。
    • 本地方法栈:用于执行本地方法。
  5. Spring的核心特性
    • 依赖注入(DI):通过容器将依赖对象注入到目标对象中。
    • 面向切面编程(AOP):将横切关注点与业务逻辑分离。
    • IoC容器:管理对象的创建、生命周期和依赖关系。
  6. Spring Boot和传统Spring相比的优势
    • 自动配置:Spring Boot根据应用引入的依赖自动进行配置,简化了配置过程。
    • 快速搭建项目:可以通过Spring Initializr快速创建项目骨架。
    • 内置服务器:可以直接运行在嵌入式Tomcat等服务器上,无需外部部署。
  7. MyBatis的工作原理:MyBatis通过XML配置文件或注解来定义SQL语句和Java对象之间的映射关系。在执行SQL时,MyBatis会根据映射关系将Java对象参数转换为SQL语句中的参数,并执行SQL查询或操作。查询结果会根据映射关系转换为Java对象返回。
  8. Dubbo的服务调用流程
    • 服务提供者:实现服务接口,配置服务暴露信息,将服务注册到注册中心。
    • 注册中心:存储服务提供者的服务信息。
    • 服务消费者:引用服务接口,从注册中心获取服务列表,通过远程调用协议调用服务提供者的服务。
  9. RabbitMq保证消息不丢失的方法
    • 发送端确认机制:生产者发送消息后等待Broker的确认,确保消息成功发送。
    • 持久化消息:将消息持久化到磁盘,防止Broker重启时消息丢失。
    • 消费端ACK:消费者接收消息后向Broker发送ACK确认,确保消息被正确消费。
    • 备份交换机:设置备份交换机,当消息发送失败或未被正确路由时,将消息转发到备份交换机处理。