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

47 阅读5分钟

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

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

面试官:不错,回答正确。那再问你,线程池有哪些参数,分别有什么作用?

王铁牛:线程池的参数有corePoolSize、maximumPoolSize、keepAliveTime、unit和workQueue。corePoolSize是核心线程数,maximumPoolSize是最大线程数,keepAliveTime是线程池线程数量超过corePoolSize时,多余的空闲线程的存活时间,unit是keepAliveTime的时间单位,workQueue是任务队列。

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

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

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

接下来第二轮提问。说说JVM的内存模型都有哪些部分?

王铁牛:JVM内存模型有程序计数器、虚拟机栈、本地方法栈、堆和方法区。

面试官:嗯,正确。那JVM的垃圾回收算法有哪些?

王铁牛:有标记清除算法、标记整理算法、复制算法和分代收集算法。

面试官:还行。再问你,Spring框架的核心特性有哪些?

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

面试官:第二轮提问完毕。

进入第三轮提问。MyBatis的工作原理是什么?

王铁牛:大概就是通过XML或注解配置SQL语句,然后通过映射器接口调用。

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

王铁牛:呃……不太清楚,大概就是找服务、调用服务吧。

面试官:最后一个问题,Redis有哪些数据结构,分别适用于什么场景?

王铁牛:这个……好像有字符串、哈希、列表、集合、有序集合,具体啥场景不太记得了。

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

答案

  • Java多线程实现方式
    • 继承Thread类:通过继承Thread类并重写run方法来创建线程。优点是编写简单,缺点是Java是单继承,继承了Thread类就不能再继承其他类了。
    • 实现Runnable接口:实现Runnable接口的run方法。优点是避免了单继承的局限性,一个类可以同时实现多个接口。
  • 线程池参数及作用
    • corePoolSize:核心线程数,当提交的任务数小于corePoolSize时,线程池会创建新线程来执行任务。
    • maximumPoolSize:最大线程数,当提交的任务数大于corePoolSize且任务队列已满时,会创建新线程直到线程数达到maximumPoolSize。
    • keepAliveTime:线程池线程数量超过corePoolSize时,多余的空闲线程的存活时间。
    • unit:keepAliveTime的时间单位。
    • workQueue:任务队列,用于存放提交的任务,当线程池线程忙碌时,任务会被放入队列中等待执行。
  • HashMap底层实现原理
    • 数组:HashMap底层维护一个数组,数组的每个元素是一个链表或红黑树的头节点。
    • 链表:当哈希冲突发生时,新元素会被添加到链表的末尾。
    • 红黑树:当链表长度大于8且数组长度大于64时,链表会转换为红黑树,以提高查询效率。
  • JVM内存模型部分
    • 程序计数器:记录当前线程执行的字节码指令地址。
    • 虚拟机栈:每个线程都有自己的虚拟机栈,用于存储局部变量、操作数栈等。
    • 本地方法栈:用于执行本地方法。
    • :是JVM中最大的内存区域,用于存储对象实例。
    • 方法区:存储类信息、常量、静态变量等。
  • JVM垃圾回收算法
    • 标记清除算法:先标记出所有需要回收的对象,然后统一回收。缺点是会产生大量不连续的内存碎片。
    • 标记整理算法:先标记出需要回收的对象,然后将存活对象向一端移动,最后清理边界以外的内存。
    • 复制算法:将内存分为两块,每次只使用其中一块,当这块内存使用完后,将存活对象复制到另一块内存。适用于对象存活率低的场景。
    • 分代收集算法:根据对象的存活周期将内存分为新生代、老年代等,不同代采用不同的垃圾回收算法。
  • Spring框架核心特性
    • 依赖注入:通过容器将依赖对象注入到目标对象中,实现对象之间的解耦。
    • 面向切面编程:通过切面将横切关注点与业务逻辑分离,提高代码的可维护性和复用性。
    • IoC容器:控制反转容器,负责创建、配置和管理对象。
  • MyBatis工作原理
    • 配置SQL语句:通过XML或注解配置SQL语句。
    • 映射器接口:定义操作数据库的接口,接口方法对应SQL语句。
    • 执行流程:通过SqlSessionFactory创建SqlSession,SqlSession根据映射器接口调用对应的SQL语句,完成数据库操作。
  • Dubbo服务调用流程
    • 服务注册:服务提供者将服务接口和实现类注册到注册中心。
    • 服务发现:服务消费者从注册中心获取服务提供者的地址列表。
    • 远程调用:服务消费者通过代理对象调用远程服务,代理对象通过网络与服务提供者进行通信,执行服务方法。
    • 结果返回:服务提供者执行完方法后,将结果返回给服务消费者。
  • Redis数据结构及适用场景
    • 字符串:适用于缓存、计数器、分布式锁等场景。
    • 哈希:适用于存储对象,比如缓存对象信息。
    • 列表:适用于消息队列、任务队列等场景。
    • 集合:适用于去重、交集、并集等操作。
    • 有序集合:适用于排行榜、热门列表等场景,元素带有分数,可以根据分数进行排序。