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

80 阅读9分钟

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

在互联网大厂的一间严肃的面试室内,面试官正襟危坐,面前坐着求职者王铁牛。紧张的氛围弥漫在空气中,一场对 Java 技术深度与广度的考验即将开始。

第一轮提问 面试官:首先问几个 Java 核心知识的问题。Java 中基本数据类型有哪些? 王铁牛:有 byte、short、int、long、float、double、char、boolean 这八种。 面试官:回答得不错。那说说面向对象的四大特性是什么? 王铁牛:是封装、继承、多态和抽象。 面试官:很好。再问一下,Java 中 String 类为什么是不可变的? 王铁牛:因为 String 类内部使用 final 修饰的字符数组来存储字符串,一旦创建,其内容不能被修改。

第二轮提问 面试官:接下来考察下 JUC、JVM 和多线程方面的知识。JUC 包中常用的类有哪些,能举几个例子吗? 王铁牛:有 CountDownLatch、CyclicBarrier、Semaphore 这些。 面试官:不错。那 JVM 的内存模型是怎样的? 王铁牛:JVM 内存主要分为堆、栈、方法区等。堆是存储对象实例的地方,栈主要存储局部变量等。 面试官:有一定了解。那说说多线程中 synchronized 和 Lock 的区别。 王铁牛:synchronized 是 Java 的关键字,是隐式锁;Lock 是一个接口,是显式锁。不过后面具体区别王铁牛说得有些含糊。

第三轮提问 面试官:现在来问一些关于框架和中间件的问题。Spring 框架中 IOC 和 AOP 是什么,有什么作用? 王铁牛:IOC 是控制反转,把对象的创建和管理交给 Spring 容器;AOP 是面向切面编程,用于实现日志记录、事务管理等功能。 面试官:回答得还行。那 Spring Boot 的自动配置原理是什么? 王铁牛:这个……好像是根据类路径下的依赖和配置文件自动配置一些 Bean,但具体过程王铁牛没有说清楚。 面试官:再问一个,MyBatis 的工作原理是怎样的? 王铁牛:大概是读取配置文件,创建 SqlSessionFactory,然后通过它创建 SqlSession 来执行 SQL 语句,但细节方面回答得很模糊。

面试官总结:王铁牛,通过这三轮的面试,我发现你对一些基础的 Java 知识掌握得还可以,比如基本数据类型、面向对象特性以及 JUC 中部分常用类等,这些简单问题你都能准确回答,说明你有一定的知识储备。然而,在面对一些稍微复杂的问题时,比如多线程中锁的具体区别、Spring Boot 自动配置原理和 MyBatis 工作原理等,你的回答就不够清晰和深入,说明你对这些知识的理解还停留在表面,缺乏实际应用和深入研究。我们公司对技术人员的要求是不仅要掌握基础知识,还需要对核心技术有深入的理解和实践经验。目前来看,你的表现有亮点,但也存在明显的不足。你先回家等通知吧,我们会综合评估后给你答复。

问题答案详细解析

  1. Java 中基本数据类型有哪些?
    • Java 有八种基本数据类型,可分为四类:
      • 整数类型:byte(1 字节,范围 -128 到 127)、short(2 字节)、int(4 字节)、long(8 字节)。
      • 浮点类型:float(4 字节)、double(8 字节)。
      • 字符类型:char(2 字节,用于存储单个字符)。
      • 布尔类型:boolean(只有 true 和 false 两个值)。
  2. 面向对象的四大特性是什么?
    • 封装:将数据和操作数据的方法绑定在一起,隐藏对象的内部实现细节,只对外提供必要的接口。比如一个类中的私有属性,通过公有的 getter 和 setter 方法来访问和修改。
    • 继承:子类可以继承父类的属性和方法,并且可以在此基础上进行扩展。它实现了代码的复用和层次结构的构建。例如,创建一个父类 Animal,子类 Dog 继承自 Animal,Dog 就拥有了 Animal 的一些属性和方法。
    • 多态:同一操作作用于不同的对象,可以有不同的表现形式。多态通过继承、接口实现和方法重写来实现。比如一个父类引用指向子类对象,调用重写的方法时会根据实际的子类对象来执行相应的方法。
    • 抽象:抽象是将一类对象的共同特征总结出来,形成抽象类或接口。抽象类不能实例化,它定义了一些抽象方法,由子类去实现。接口则是一种特殊的抽象类型,只包含抽象方法和常量。
  3. Java 中 String 类为什么是不可变的?
    • String 类内部使用 final 修饰的字符数组 private final char value[]; 来存储字符串。final 关键字确保了这个数组的引用不能被改变,一旦创建了 String 对象,其内部的字符数组内容就不能被修改。这种不可变性带来了很多好处,比如线程安全,多个线程可以同时访问同一个 String 对象而不会有数据竞争问题;可以作为 HashMap 等容器的键,因为其哈希值在创建后不会改变,保证了哈希表的正确性。
  4. JUC 包中常用的类有哪些,能举几个例子吗?
    • CountDownLatch:一个同步辅助类,允许一个或多个线程等待其他线程完成操作。例如,主线程等待多个子线程完成任务后再继续执行,通过设置一个初始计数,每个子线程完成任务后调用 countDown() 方法将计数减 1,主线程调用 await() 方法等待计数变为 0。
    • CyclicBarrier:它允许一组线程相互等待,直到所有线程都到达一个公共屏障点,然后所有线程可以继续执行。可以用于多个线程需要同时开始执行某个任务的场景。
    • Semaphore:用于控制同时访问某个资源的线程数量。通过 acquire() 方法获取许可,release() 方法释放许可,从而限制并发线程的数量。
  5. JVM 的内存模型是怎样的?
    • 堆(Heap):是 JVM 中最大的一块内存区域,用于存储对象实例和数组。几乎所有的对象实例都在这里分配内存。堆是垃圾回收的主要区域,分为新生代和老年代。
    • 栈(Stack):主要存储局部变量、方法调用的上下文信息等。每个线程都有自己独立的栈,栈中的数据是线程私有的。栈帧是栈的基本单位,每个方法调用都会创建一个栈帧,方法执行完后栈帧会被销毁。
    • 方法区(Method Area):用于存储类的元数据信息,如类的结构、常量池、静态变量等。在 JDK 8 之前,方法区也被称为永久代,JDK 8 及以后使用元空间(Metaspace)来替代永久代。
    • 程序计数器(Program Counter Register):每个线程都有一个独立的程序计数器,它指向当前线程正在执行的字节码指令地址。如果执行的是本地方法,程序计数器的值为 undefined。
    • 本地方法栈(Native Method Stack):与栈类似,不过它是为本地方法服务的,本地方法是使用其他语言(如 C、C++)实现的方法。
  6. 多线程中 synchronized 和 Lock 的区别。
    • 语法层面:synchronized 是 Java 的关键字,是隐式锁,通过 synchronized 代码块或方法来使用,当代码执行完或出现异常时会自动释放锁。Lock 是一个接口,需要显式地调用 lock() 方法加锁和 unlock() 方法解锁,通常在 finally 块中释放锁以确保锁一定会被释放。
    • 锁的获取和释放:synchronized 无法中断锁的获取,当一个线程持有锁时,其他线程只能等待。而 Lock 可以使用 tryLock() 方法尝试获取锁,还可以使用 lockInterruptibly() 方法在等待锁的过程中响应中断。
    • 锁的粒度:synchronized 锁的粒度比较大,通常是对整个方法或代码块加锁。Lock 可以更灵活地控制锁的粒度,例如可以实现公平锁和非公平锁,通过 ReentrantLock 可以指定是否为公平锁。
  7. Spring 框架中 IOC 和 AOP 是什么,有什么作用?
    • IOC(Inversion of Control,控制反转):传统的程序中,对象的创建和依赖关系的管理是由程序本身来完成的,而在 Spring 中,将对象的创建和管理交给了 Spring 容器。通过 XML 配置文件、注解等方式,Spring 容器负责创建对象并注入对象之间的依赖关系。这样做的好处是降低了代码的耦合度,提高了代码的可维护性和可测试性。
    • AOP(Aspect-Oriented Programming,面向切面编程):它是对面向对象编程的一种补充,主要用于处理一些横切关注点,如日志记录、事务管理、权限验证等。这些功能在多个业务模块中都会用到,但又与业务逻辑本身无关。AOP 通过将这些横切关注点封装成切面,在不修改原有业务代码的情况下,将这些功能动态地织入到业务流程中。
  8. Spring Boot 的自动配置原理是什么?
    • Spring Boot 的自动配置基于 Spring 的条件注解和类路径扫描机制。当 Spring Boot 应用启动时,会加载 spring.factories 文件,该文件中定义了一系列自动配置类。这些自动配置类会根据类路径下的依赖和配置文件中的属性来判断是否满足自动配置的条件。如果满足条件,就会自动创建相应的 Bean 并注入到 Spring 容器中。例如,如果类路径下存在 MySQL 驱动,Spring Boot 会自动配置数据源和 JdbcTemplate 等相关 Bean。
  9. MyBatis 的工作原理是怎样的?
    • 读取配置文件:MyBatis 首先会读取 mybatis-config.xml 配置文件,该文件中包含了数据库连接信息、Mapper 文件的位置等。
    • 创建 SqlSessionFactory:根据配置文件创建 SqlSessionFactory,它是 MyBatis 的核心工厂类,负责创建 SqlSession 对象。
    • 创建 SqlSession:通过 SqlSessionFactory 创建 SqlSession 对象,SqlSession 是 MyBatis 与数据库交互的会话对象,它提供了执行 SQL 语句的方法。
    • 执行 SQL 语句:SqlSession 通过调用 Mapper 接口的方法或直接执行 XML 配置文件中的 SQL 语句来与数据库进行交互。Mapper 接口中的方法会根据映射关系找到对应的 SQL 语句,然后将参数传递给 SQL 语句并执行。
    • 关闭 SqlSession:操作完成后,需要关闭 SqlSession 以释放资源。