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

35 阅读7分钟

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

第二轮面试 面试官:进入JUC和多线程相关。线程池的核心参数有哪些,分别有什么作用? 王铁牛:呃……有核心线程数,就是线程池一开始创建的线程数量。还有最大线程数,就是最多能创建的线程数。还有队列,用来存放任务。 面试官:那线程池的拒绝策略有哪些,简单说下。 王铁牛:好像有直接拒绝,就是任务满了就拒绝。还有……还有把任务丢给调用者执行,其他的我不太记得了。 面试官:JVM的垃圾回收机制了解吗,说下常见的垃圾回收算法。 王铁牛:嗯……有标记清除算法,先标记垃圾对象,然后清除。还有复制算法,把存活对象复制到另一块空间。其他的就不太清楚了。

第三轮面试 面试官:谈谈Dubbo的服务治理功能有哪些? 王铁牛:就是服务注册与发现,还有负载均衡,能让请求均匀分配到不同服务实例上。 面试官:RabbitMQ在高并发场景下如何保证消息不丢失? 王铁牛:嗯……好像要开启确认机制,生产者发消息后能知道消息有没有成功到达队列。还有持久化,把队列和消息都持久化到磁盘。 面试官:xxl - job的核心原理是什么,简单讲讲。 王铁牛:它好像是一个分布式任务调度平台,通过调度中心来管理任务,具体原理我还没深入研究过。

面试结束,面试官严肃地看着王铁牛说:“你的面试表现整体有一定基础,但对于一些较深入的问题回答得还不够完善。我们后续会综合评估所有候选人,你先回家等通知吧,无论结果如何,我们都会在一周内给你回复。”

问题答案

  1. Java中多态是如何实现的:多态通过继承、重写和接口实现。继承使得子类拥有父类的属性和方法,重写允许子类重新定义父类方法,接口实现让类具有多种行为。父类引用指向子类对象时,运行时根据实际对象类型调用相应方法。例如,定义一个Animal父类和Dog、Cat子类,都有叫声方法,通过父类引用调用叫声方法,实际执行的是子类重写后的方法。
  2. ArrayList和HashMap在存储结构上有什么区别:ArrayList基于动态数组,元素按顺序存储在连续内存空间,查询时通过索引直接定位,时间复杂度为O(1),增删操作可能涉及数组扩容和元素移动,时间复杂度为O(n)。HashMap基于哈希表,通过哈希函数将键映射到数组位置,若有冲突则通过链表或红黑树解决,查询、插入和删除平均时间复杂度为O(1),存储结构是键值对形式。
  3. Spring框架中IOC的作用是什么:IOC即控制反转,将对象创建和管理的控制权从应用代码转移到Spring容器。传统开发中对象创建和依赖关系管理在代码内部,耦合度高。使用IOC,对象由容器创建、配置和管理,组件间依赖关系通过容器注入,降低耦合,提高代码可维护性和可测试性。例如,一个Service类依赖另一个Dao类,通过IOC容器注入Dao实例,Service无需自己创建Dao。
  4. 线程池的核心参数有哪些,分别有什么作用:核心线程数(corePoolSize):线程池初始化创建的线程数量,即使这些线程处于空闲状态也不会被销毁。最大线程数(maximumPoolSize):线程池允许创建的最大线程数量。队列容量(workQueue):用于存放等待执行任务的队列。当核心线程都在忙碌且队列未满时,新任务会放入队列;队列满后,才会创建新线程直到达到最大线程数。线程存活时间(keepAliveTime):当线程数大于核心线程数时,多余空闲线程等待新任务的最长时间,超过此时间会被销毁。
  5. 线程池的拒绝策略有哪些:AbortPolicy(直接拒绝):任务提交到线程池被拒绝时,抛出RejectedExecutionException异常。CallerRunsPolicy(调用者运行):将被拒绝的任务交给调用execute方法的线程执行。DiscardPolicy(丢弃策略):直接丢弃被拒绝的任务,不做任何处理。DiscardOldestPolicy(丢弃最老任务):丢弃队列中最老的任务(即将队列头部的任务出队),然后尝试提交新任务。
  6. JVM的垃圾回收机制了解吗,说下常见的垃圾回收算法:标记 - 清除算法:先标记所有可回收对象,然后统一回收所有被标记的对象。缺点是会产生大量不连续内存碎片。复制算法:将内存分为两块,每次只使用其中一块,当这块内存满时,将存活对象复制到另一块,然后清除原内存块。适用于新生代,因为新生代对象存活率低。标记 - 整理算法:先标记可回收对象,然后将存活对象向一端移动,最后清除边界以外的内存,解决了标记 - 清除算法的碎片问题,适用于老年代。分代收集算法:根据对象存活周期不同将内存分为新生代和老年代等不同区域,对不同区域采用不同回收算法。新生代使用复制算法,老年代使用标记 - 整理或标记 - 清除算法。
  7. Dubbo的服务治理功能有哪些:服务注册与发现:通过注册中心(如Zookeeper),服务提供者将自己的服务注册到注册中心,服务消费者从注册中心获取服务地址。负载均衡:在多个服务提供者实例间分配请求,常见算法有随机、轮询、最少活跃调用数等,确保请求均匀分配,提高系统整体性能。服务监控:监控服务调用次数、调用时长等指标,便于了解服务运行状态。服务降级:当某个服务出现故障或压力过大时,暂时屏蔽该服务,返回兜底数据,保证系统整体可用性。
  8. RabbitMQ在高并发场景下如何保证消息不丢失:生产者确认机制(publisher confirm):生产者发送消息后,RabbitMQ会返回确认结果,告知消息是否成功到达Broker。可通过设置channel.confirmSelect()开启,生产者通过监听ConfirmListener获取确认结果。消息持久化:将队列和消息都设置为持久化。队列持久化通过声明队列时设置durable参数为true,消息持久化通过设置MessageProperties.PERSISTENT_TEXT_PLAIN。消费者确认机制(ack):消费者处理完消息后,向RabbitMQ发送确认消息,RabbitMQ才会从队列中删除该消息。可设置手动确认(channel.basicAck),确保消息被正确处理。
  9. xxl - job的核心原理是什么:xxl - job是一个分布式任务调度平台。调度中心负责任务的管理、调度和监控。执行器负责实际任务的执行。调度中心通过数据库存储任务信息,包括任务的调度规则、执行器地址等。调度中心按照设定的调度规则触发任务,通过HTTP或其他协议调用执行器的接口,执行器接收到任务请求后执行具体任务逻辑,并将执行结果返回给调度中心。调度中心根据执行结果进行相应处理,如记录日志、监控任务状态等。