《互联网大厂面试:全面考察 Java 核心、框架与中间件知识》

51 阅读7分钟

互联网大厂面试:全面考察 Java 核心、框架与中间件知识

在互联网大厂的面试室里,气氛紧张而严肃。面试官正襟危坐,面前摆放着求职者的简历,而求职者王铁牛坐在对面,略显紧张地搓着手。

第一轮面试开始 面试官:我们先从 Java 核心知识开始。Java 中基本数据类型有哪些? 王铁牛:这个我知道,有 byte、short、int、long、float、double、char、boolean。 面试官:不错,回答得很准确。那你说说 String 类为什么是不可变的? 王铁牛:因为 String 类被 final 修饰,它的成员变量也是 final 的,所以它是不可变的。 面试官:很好。那在 Java 里,什么是多态? 王铁牛:多态就是一个对象有多种形态,可以通过父类引用指向子类对象,然后调用重写的方法。 面试官:非常棒,看来你对 Java 核心知识掌握得很扎实。

第二轮面试开始 面试官:接下来聊聊 JUC 相关的。JUC 里的 CountDownLatch 是做什么用的? 王铁牛:嗯……好像是用来控制线程的,让一个线程等待其他线程完成某些操作。 面试官:大概意思对了。那你说说它和 CyclicBarrier 有什么区别? 王铁牛:这个……我有点不太清楚,好像它们都是和线程同步有关的。 面试官:那 JUC 中的 Semaphore 你了解吗,它的应用场景有哪些? 王铁牛:Semaphore 我知道一点,好像是用来控制资源的访问数量的,场景嘛,我想想……就是在很多线程要访问有限资源的时候用吧。不过具体我也说不太清。 面试官:你对部分概念有一定了解,但还不够深入。

第三轮面试开始 面试官:现在说说 Spring 框架。Spring 的 IoC 是什么,它的实现原理是什么? 王铁牛:IoC 就是控制反转,把对象的创建和管理交给 Spring 容器。原理嘛……就是通过一些配置文件或者注解来创建对象。 面试官:你说的只是一部分。那 Spring 的 AOP 呢,它的应用场景有哪些? 王铁牛:AOP 是面向切面编程,场景有日志记录、事务管理这些。但是具体怎么实现的我不太明白。 面试官:还有 Spring Boot,它和 Spring 有什么区别,为什么要用 Spring Boot? 王铁牛:Spring Boot 好像是简化了 Spring 的配置,用起来更方便。但具体为啥用,我也说不好。 面试官:你对这些框架有基本的认知,但对于原理和深入应用方面还需要加强。

面试结束,面试官整理了一下手中的资料,严肃地说:“今天的面试就到这里,你的表现有一定基础,对一些简单概念掌握得还可以,但在深入技术原理和应用场景的理解上还有欠缺。我们会综合评估后给你答复,请你回家等通知吧。”

答案详解

  1. Java 基本数据类型:Java 中有 8 种基本数据类型,分别为 4 种整数类型(byte 占 1 字节,范围 -128 到 127;short 占 2 字节;int 占 4 字节,是最常用的整数类型;long 占 8 字节,定义时需在数字后加 L)、2 种浮点类型(float 占 4 字节,定义时需在数字后加 F;double 占 8 字节,是常用的浮点类型)、1 种字符类型(char 占 2 字节,用于存储单个字符)和 1 种布尔类型(boolean 只有 true 和 false 两个值)。
  2. String 类不可变的原因:String 类被 final 修饰,意味着它不能被继承。其内部的字符数组 value 也是 final 的,一旦初始化后,引用不能再指向其他数组对象。并且 String 类没有提供修改字符数组内容的公共方法,所以 String 对象一旦创建,其内容不能被修改,保证了不可变性。
  3. Java 多态:多态是面向对象编程的重要特性之一。它基于继承和方法重写实现。通过父类引用指向子类对象,在运行时根据实际对象的类型来调用相应的方法。例如,有一个父类 Animal 和子类 Cat、Dog,Animal 类有一个 eat 方法,Cat 和 Dog 类重写了 eat 方法。当使用 Animal 类型的引用指向 Cat 或 Dog 对象时,调用 eat 方法会根据实际对象类型调用对应的方法,实现了同一个方法调用在不同对象上有不同的表现。
  4. JUC 中的 CountDownLatch:CountDownLatch 是一个同步工具类,用于让一个或多个线程等待其他线程完成操作。它通过一个计数器来实现,在创建 CountDownLatch 时指定计数器的初始值。每个线程完成任务后调用 countDown 方法将计数器减 1,当计数器变为 0 时,等待的线程将被唤醒继续执行。例如,在一个多线程的任务中,主线程需要等待所有子线程完成数据加载后再进行后续操作,就可以使用 CountDownLatch。
  5. CountDownLatch 和 CyclicBarrier 的区别:CountDownLatch 的计数器只能使用一次,当计数器变为 0 后就不能再使用;而 CyclicBarrier 的计数器可以循环使用,当所有线程到达屏障点后,计数器会重置。CountDownLatch 主要用于一个或多个线程等待其他线程完成任务;CyclicBarrier 主要用于多个线程相互等待,当所有线程都到达某个状态后再一起继续执行。
  6. JUC 中的 Semaphore:Semaphore 用于控制对有限资源的访问数量。它维护了一个许可证数量,线程在访问资源前需要先获取许可证,访问完后释放许可证。如果没有可用的许可证,线程会被阻塞。应用场景包括数据库连接池,限制同时连接数据库的线程数量;在一个停车场系统中,限制同时进入停车场的车辆数量等。
  7. Spring 的 IoC:IoC 即控制反转,是 Spring 框架的核心特性之一。传统的对象创建和管理是在代码中手动进行的,而 IoC 把对象的创建、依赖关系的管理交给 Spring 容器。实现原理主要通过 XML 配置文件、注解或 Java 配置类来描述对象之间的依赖关系,Spring 容器在启动时会根据这些配置信息创建和管理对象。例如,在 XML 配置文件中可以通过 标签来定义对象,Spring 容器会根据标签信息创建对象并注入依赖。
  8. Spring 的 AOP:AOP 即面向切面编程,它是对 OOP(面向对象编程)的补充。AOP 主要用于将一些与业务逻辑无关但又被多个模块共同使用的功能(如日志记录、事务管理、权限验证等)提取出来,形成独立的切面,在不修改原有业务逻辑的基础上,将这些切面功能动态地织入到业务代码中。应用场景包括在方法执行前后记录日志、在数据库操作时进行事务管理等。
  9. Spring Boot 和 Spring 的区别及使用原因:Spring 是一个功能强大的 Java 开发框架,但配置较为繁琐,需要编写大量的 XML 配置文件或 Java 配置类。Spring Boot 是在 Spring 基础上发展而来的,它采用了约定大于配置的原则,通过自动配置机制,减少了大量的配置工作。使用 Spring Boot 可以快速搭建项目,提高开发效率,同时它还提供了内置的服务器(如 Tomcat、Jetty 等),方便项目的部署和运行。