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

35 阅读6分钟

第一轮面试 面试官:先聊聊Java基础,说说Java中基本数据类型有哪些? 王铁牛:基本数据类型有整型,像byte、short、int、long,还有浮点型float、double,字符型char,布尔型boolean。 面试官:不错,回答得很准确。那自动装箱和拆箱是怎么回事? 王铁牛:自动装箱就是把基本数据类型转为包装类型,比如int转Integer;拆箱就是反过来,包装类型转基本数据类型。 面试官:回答得很好。ArrayList和LinkedList有什么区别? 王铁牛:ArrayList是基于数组实现的,随机访问快,增删慢;LinkedList是基于链表实现的,增删快,随机访问慢。 面试官:非常好,基础知识掌握得很扎实。

第二轮面试 面试官:接下来谈谈多线程和JUC。线程有哪些状态? 王铁牛:呃……有新建、就绪、运行、阻塞,还有终止。 面试官:还行。那说说线程池的核心参数有哪些? 王铁牛:有核心线程数,还有最大线程数,嗯……还有个队列容量。 面试官:勉强算对。讲讲AQS原理,它在JUC中有什么作用? 王铁牛:AQS……好像是个同步框架,能实现锁啥的,具体咋回事我不太清楚。 面试官:这块理解得不太到位,希望你后续加强学习。

第三轮面试 面试官:聊聊框架相关。Spring中IOC和AOP是什么? 王铁牛:IOC是控制反转,把对象创建和管理交给Spring容器;AOP是面向切面编程,能实现日志、事务这些功能。 面试官:还不错。Spring Boot有什么优势,和Spring有什么区别? 王铁牛:Spring Boot能快速搭建项目,它简化了Spring配置。区别嘛,Spring Boot更方便开发。 面试官:那MyBatis中#{}和{}有什么区别? **王铁牛**:#{}是预编译,能防止SQL注入;{}是直接拼接SQL,不安全。 面试官:最后问下Dubbo、RabbitMq、xxl - job和Redis。Dubbo的工作原理是什么? 王铁牛:Dubbo好像是个分布式框架,能做服务治理,具体原理不太明白。 面试官:好的,今天的面试就到这里。你对自己今天的表现应该也有一定认识,有些基础问题回答得不错,但在一些进阶知识点上理解还不够深入。回去等通知吧,我们会综合评估所有候选人后再做决定。

问题答案

  1. Java基本数据类型:Java有8种基本数据类型,分为四类。整型:byte(1字节)、short(2字节)、int(4字节)、long(8字节),用于表示整数;浮点型:float(4字节,单精度)、double(8字节,双精度),用于表示小数;字符型:char(2字节),用于表示单个字符;布尔型:boolean,只有true和false两个值,用于逻辑判断。
  2. 自动装箱和拆箱:自动装箱是Java编译器在编译期自动将基本数据类型转换为对应的包装类型,例如int i = 10; Integer integer = i;,这里编译器会自动调用Integer.valueOf(i)方法。拆箱则是将包装类型转换为基本数据类型,如Integer integer = 10; int i = integer;,编译器会自动调用integer.intValue()方法。
  3. ArrayList和LinkedList区别:ArrayList基于动态数组实现,内存连续,支持随机访问,通过下标访问元素时间复杂度为O(1),但在中间插入或删除元素时,需要移动大量元素,时间复杂度为O(n)。LinkedList基于双向链表实现,内存不连续,插入和删除元素只需修改前后节点的指针,时间复杂度为O(1),但随机访问时需要从头或尾遍历链表,时间复杂度为O(n)。
  4. 线程状态:新建(New):线程被创建但尚未启动。就绪(Runnable):线程调用start()方法后进入该状态,等待CPU调度执行。运行(Running):获得CPU时间片正在执行。阻塞(Blocked):线程因某些原因暂停执行,如等待锁、I/O操作等。终止(Terminated):线程执行完毕或因异常退出。
  5. 线程池核心参数:核心线程数(corePoolSize):线程池中常驻的线程数,即使这些线程处于空闲状态也不会被销毁。最大线程数(maximumPoolSize):线程池允许创建的最大线程数。队列容量(workQueue):用于存放等待执行任务的队列。还有线程存活时间(keepAliveTime),当线程数大于核心线程数时,多余的空闲线程存活的最长时间;时间单位(unit),keepAliveTime的时间单位,如TimeUnit.SECONDS
  6. AQS原理及作用:AQS(AbstractQueuedSynchronizer)是JUC包下实现同步器的基础框架。它通过一个FIFO队列来管理等待获取锁的线程,利用一个int类型的变量(state)来表示同步状态。当线程获取锁时,如果state为0表示锁空闲,线程可以获取并将state设为1(可重入锁会根据重入次数增加state值);如果state不为0则线程进入队列等待。AQS能实现多种同步器,如ReentrantLock、CountDownLatch、Semaphore等,极大简化了同步器的实现。
  7. Spring中IOC和AOP:IOC(Inversion of Control)控制反转,将对象的创建和管理从应用代码转移到Spring容器,通过依赖注入(Dependency Injection)实现。比如一个类A依赖类B,传统方式是在A中自己创建B的实例,而在Spring中,由Spring容器创建B的实例并注入到A中。AOP(Aspect - Oriented Programming)面向切面编程,将一些通用功能(如日志记录、事务管理、权限控制)从业务逻辑中分离出来,以切面的形式织入到目标对象的方法执行前后。通过切点定义哪些方法需要被增强,通过通知定义增强的逻辑。
  8. Spring Boot优势及与Spring区别:Spring Boot优势在于快速搭建Spring应用,它提供了大量的默认配置,减少了繁琐的XML配置或Java配置,内置了Tomcat等服务器,可直接打包成可执行的jar或war文件。与Spring区别在于,Spring更侧重于提供基础的IOC和AOP等功能,需要开发者手动配置很多内容;Spring Boot则是基于Spring,对开发进行了简化,专注于快速开发和部署。
  9. **MyBatis中#{}和{}区别**:#{}是预编译方式,MyBatis会将SQL中的#{}替换为?,并使用PreparedStatement设置参数值,能有效防止SQL注入。例如`select * from user where username = #{username}`。{}是字符串替换方式,MyBatis会直接将中的内容替换到SQL中,如selectfromuserwhereusername={}中的内容替换到SQL中,如`select * from user where username = '{username}'`,如果参数值来自用户输入,容易导致SQL注入。
  10. Dubbo工作原理:Dubbo是阿里巴巴开源的分布式服务框架。服务提供者在启动时,向注册中心(如Zookeeper)注册自己提供的服务。服务消费者在启动时,从注册中心订阅自己所需的服务。注册中心返回服务提供者的地址列表给消费者。消费者根据负载均衡算法从地址列表中选择一个提供者发起调用。在调用过程中,Dubbo提供了监控中心,用于统计服务调用次数、调用时间等信息。