《互联网大厂Java面试:从基础到进阶的核心知识大考察》

105 阅读7分钟

第一轮面试 面试官:先从基础的Java核心知识问起。Java中多态是如何实现的? 王铁牛:多态就是一个对象多种形态嘛,通过继承和重写方法,还有接口实现来达成。父类引用指向子类对象,调用方法时就体现出多态了。 面试官:回答得不错。那说说ArrayList和HashMap在存储结构上有什么不同? 王铁牛:ArrayList是基于数组的,顺序存储数据。HashMap是基于哈希表,通过键值对存储,用哈希算法来确定存储位置。 面试官:很好。那Spring框架中IOC是什么,有什么作用? 王铁牛:IOC就是控制反转,把对象的创建和管理交给Spring容器,这样代码耦合度降低,更利于维护和扩展。

第二轮面试 面试官:接下来问问JUC相关。线程池有哪些核心参数,分别有什么作用? 王铁牛:嗯……有核心线程数,就是一直存活的线程数量。还有最大线程数,就是线程池能容纳的最大线程数。还有队列容量,用来存放等待执行的任务。 面试官:还行。那说说在高并发场景下,HashMap为什么不安全,而ConcurrentHashMap是如何保证线程安全的? 王铁牛:HashMap不安全好像是因为多线程操作时会出现数据覆盖啥的。ConcurrentHashMap……嗯……好像是分段加锁来保证线程安全。 面试官:解释得不太清晰。那JVM的垃圾回收机制,常见的垃圾回收算法有哪些? 王铁牛:有标记 - 清除算法,标记出要回收的对象然后清除。还有复制算法,把存活对象复制到另一块空间。还有标记 - 整理算法,标记后把存活对象整理到一端。

第三轮面试 面试官:现在问些更深入的。Dubbo在分布式系统中有什么作用,它的服务调用流程是怎样的? 王铁牛:Dubbo是做服务治理的,能实现服务的注册与发现。调用流程嘛,好像是消费者从注册中心获取服务提供者地址,然后就调用了。 面试官:回答得太简略。RabbitMQ在消息队列场景下,如何保证消息的可靠性传输? 王铁牛:嗯……好像可以开启确认机制,生产者发消息后等确认。还有持久化,把消息存起来。 面试官:不太全面。xxl - job在分布式任务调度中有什么优势,它的原理是什么? 王铁牛:优势就是简单易用吧。原理……我不太清楚。

面试官:好的,今天的面试就到这里。你回去等通知吧,我们会综合评估各位候选人的情况,有消息会尽快联系你。感谢你今天来参加面试。

问题答案

  1. Java中多态是如何实现的:多态通过继承、重写和接口实现。继承使得子类拥有父类的属性和方法,重写是子类对父类方法的重新定义,接口实现让类具有特定行为。父类引用指向子类对象时,调用方法会根据实际对象类型决定执行哪个版本的方法。例如,父类Animal有eat方法,子类Dog继承Animal并重写eat方法,当Animal animal = new Dog(); animal.eat(); 就会执行Dog类的eat方法。
  2. ArrayList和HashMap在存储结构上有什么不同:ArrayList基于动态数组,元素按顺序存储,通过索引访问元素效率高,适合顺序访问场景。HashMap基于哈希表,以键值对形式存储,通过哈希函数计算键的哈希值确定存储位置,能快速根据键查找值,适合快速查找场景。
  3. Spring框架中IOC是什么,有什么作用:IOC即控制反转,是一种设计思想。传统方式对象创建和管理由应用程序自身负责,耦合度高。IOC将对象创建、配置和管理交给Spring容器,应用程序只需使用对象。这样降低了组件间耦合,提高了代码可维护性和可测试性。例如,一个Service依赖另一个Dao,通过IOC容器注入Dao,Service无需关心Dao的创建。
  4. 线程池有哪些核心参数,分别有什么作用:核心线程数,线程池初始化时创建的线程数量,这些线程一般不会被销毁;最大线程数,线程池能容纳的最大线程数量;队列容量,用于存放等待执行任务的队列大小;线程存活时间,当线程数大于核心线程数时,多余线程在空闲时间达到该值后会被销毁;拒绝策略,当任务队列已满且线程数达到最大线程数时,新任务的处理策略,如直接拒绝、使用调用者线程执行等。
  5. 在高并发场景下,HashMap为什么不安全,而ConcurrentHashMap是如何保证线程安全的:HashMap在高并发下不安全,因为多线程同时操作时,可能会出现数据覆盖、死循环等问题。例如,在扩容时多个线程同时操作,可能导致链表成环。ConcurrentHashMap在JDK1.7采用分段锁机制,将数据分成多个段,每个段有独立锁,不同段可并发操作;JDK1.8采用CAS + synchronized机制,对链表头或红黑树节点加锁,提高并发性能。
  6. JVM的垃圾回收机制,常见的垃圾回收算法有哪些:标记 - 清除算法,先标记出所有可回收对象,然后统一回收。缺点是会产生大量碎片。复制算法,将内存分为两块,每次只使用一块,当这块内存满时,将存活对象复制到另一块,然后清空当前块。优点是没有碎片,但浪费空间。标记 - 整理算法,先标记可回收对象,然后将存活对象向一端移动,最后清理边界外内存,解决了碎片问题。
  7. Dubbo在分布式系统中有什么作用,它的服务调用流程是怎样的:Dubbo是高性能的Java RPC框架,用于分布式服务治理。作用包括服务注册与发现、负载均衡、服务调用监控等。服务调用流程:服务提供者启动时向注册中心(如Zookeeper)注册服务;消费者启动时从注册中心订阅服务提供者地址列表;消费者调用服务时,基于负载均衡算法从地址列表中选择一个提供者发起调用;服务调用过程中,监控中心收集服务调用的统计信息。
  8. RabbitMQ在消息队列场景下,如何保证消息的可靠性传输:生产者开启confirm模式,消息发送到RabbitMQ后,RabbitMQ会给生产者发送确认消息,表明消息已接收。消息持久化,将队列和消息都设置为持久化,保证RabbitMQ重启后数据不丢失。消费者采用手动确认模式,处理完消息后向RabbitMQ发送确认,防止消息丢失。
  9. xxl - job在分布式任务调度中有什么优势,它的原理是什么:优势包括简单易用,提供可视化界面进行任务管理;支持集群部署,提高调度系统可用性;支持多种调度策略,如CRON表达式等。原理:调度中心是核心,负责任务管理、调度触发等;执行器负责接收调度中心指令并执行任务;调度中心通过数据库存储任务信息,调度时根据任务配置触发执行器执行任务,执行器执行完任务后将结果反馈给调度中心。