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

36 阅读5分钟

第一轮面试 面试官:先聊聊Java基础,Java中基本数据类型有哪些? 王铁牛:基本数据类型有 byte、short、int、long、float、double、char、boolean。 面试官:不错,回答得很准确。那自动装箱和拆箱是怎么回事? 王铁牛:自动装箱就是把基本数据类型转为包装类型,拆箱就是反过来,把包装类型转为基本数据类型。 面试官:回答得不错。再问个关于集合的,ArrayList 和 LinkedList 的区别是什么? 王铁牛:ArrayList 是基于数组实现的,随机访问快,增删慢;LinkedList 是基于链表实现的,增删快,随机访问慢。 面试官:很好,基础掌握得挺扎实。

第二轮面试 面试官:接下来谈谈多线程,线程有哪些状态? 王铁牛:新建、就绪、运行、阻塞、死亡这几种状态。 面试官:那线程池用过吗?讲讲线程池的核心参数。 王铁牛:呃……有核心线程数、最大线程数,还有……还有那个阻塞队列。 面试官:嗯,说对了一部分。那线程池的拒绝策略有哪些? 王铁牛:这个……好像有直接拒绝,还有……我不太确定了。 面试官:好吧,这部分理解得还不够深入。

第三轮面试 面试官:聊聊框架,Spring 中 IOC 和 AOP 是什么? 王铁牛:IOC 是控制反转,把对象创建和管理交给 Spring 容器;AOP 是面向切面编程,能在不修改原有代码基础上增加功能。 面试官:还不错。那 Spring Boot 相对于 Spring 有什么优势? 王铁牛:Spring Boot 能快速搭建项目,自动配置,简化开发。 面试官:好。最后问个分布式相关的,Dubbo 是什么,有什么作用? 王铁牛:Dubbo 是个分布式服务框架,能做服务治理,嗯……好像能实现服务调用啥的。 面试官:嗯,回答得比较模糊。今天的面试就到这里,你回去等通知吧。我们会综合评估你的表现,无论结果如何,都会尽快给你答复。感谢你今天来参加面试。

问题答案

  1. Java基本数据类型:Java有8种基本数据类型,byte(1字节)、short(2字节)、int(4字节)、long(8字节),用于整数存储;float(4字节)、double(8字节)用于浮点数存储;char(2字节)用于存储单个字符;boolean 用于存储布尔值,理论上占1位,但实际实现可能不同。
  2. 自动装箱和拆箱:自动装箱是Java编译器在编译期自动将基本数据类型转为对应的包装类型,如Integer i = 10; 这里10是int类型,编译器自动将其装箱为Integer对象。拆箱则相反,如int j = i; 编译器自动将Integer对象i拆箱为int类型。这一机制方便了基本数据类型和包装类型之间的转换,在集合类等场景中广泛应用。
  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),当线程数大于核心线程数时,多余的空闲线程存活的最长时间。
  6. 线程池拒绝策略:AbortPolicy(直接拒绝):当任务无法执行时,抛出RejectedExecutionException异常。CallerRunsPolicy(调用者运行):将任务交回给调用execute()方法的线程执行。DiscardPolicy(丢弃策略):直接丢弃无法执行的任务,不抛出异常。DiscardOldestPolicy(丢弃最旧任务):丢弃队列中最旧的任务,然后尝试提交新任务。
  7. Spring中IOC和AOP:IOC(控制反转):传统开发中,对象的创建和依赖关系由程序自身控制,而在Spring中,将对象的创建、管理和依赖注入交给Spring容器,程序只需要使用对象,降低了组件之间的耦合度。AOP(面向切面编程):将与业务逻辑无关的通用功能(如日志记录、事务管理等)抽取出来形成切面,在不修改原有业务代码的基础上,通过动态代理等技术将切面功能织入到目标方法执行的前后,实现功能增强。
  8. Spring Boot相对于Spring的优势:Spring Boot 提供了自动配置功能,能根据项目依赖自动配置Spring应用,大大减少了配置文件的编写。它内置了服务器(如Tomcat、Jetty),可直接打包成可执行的jar或war文件,方便部署。还提供了一系列的starter依赖,简化了依赖管理,能快速搭建项目,提高开发效率。
  9. Dubbo:Dubbo是阿里巴巴开源的高性能、轻量级的分布式服务框架。它主要用于解决微服务架构下的服务治理问题,提供了服务注册与发现、服务调用、负载均衡、容错等功能。通过Dubbo,不同的微服务可以方便地进行通信和交互,提高系统的可扩展性和维护性。