《互联网大厂面试:Java 核心、JUC、JVM 等技术大考验》

37 阅读7分钟

互联网大厂面试:Java 核心、JUC、JVM 等技术大考验

在互联网大厂的一间明亮的面试室内,严肃的面试官正襟危坐,对面坐着略显紧张的王铁牛。面试正式开始。

第一轮提问 面试官:首先问你几个 Java 核心知识的问题。Java 中基本数据类型有哪些? 王铁牛:有 byte、short、int、long、float、double、char、boolean 这八种。 面试官:回答得不错。那 String 是基本数据类型吗? 王铁牛:不是,String 是引用数据类型,它是一个类。 面试官:很好。那在 Java 中,什么是多态? 王铁牛:多态就是同一个行为具有多个不同表现形式或形态的能力。比如父类的引用可以指向子类的对象,通过父类引用调用重写的方法,会根据实际指向的子类对象来执行不同的实现。 面试官:非常棒,你的基础很扎实。

第二轮提问 面试官:接下来我问你一些关于 JUC 和多线程的问题。什么是 JUC? 王铁牛:JUC 就是 java.util.concurrent 包,它提供了一些用于多线程编程的工具类。 面试官:那线程有哪些状态? 王铁牛:线程有新建、就绪、运行、阻塞和死亡这五种状态。 面试官:不错。那你说说什么是线程池?为什么要使用线程池? 王铁牛:线程池就是预先创建好一定数量的线程,当有任务提交时,从线程池中获取线程来执行任务。使用线程池可以减少线程创建和销毁的开销,提高系统的性能,还可以对线程进行统一的管理和监控。 面试官:回答得很全面,看来你对多线程这块有一定的了解。

第三轮提问 面试官:现在我问你一些关于框架的问题。Spring 框架的核心特性有哪些? 王铁牛:Spring 的核心特性有 IoC(控制反转)和 AOP(面向切面编程)。IoC 就是把对象的创建和依赖关系的管理交给 Spring 容器,AOP 是在不修改原有代码的基础上,对程序进行增强。 面试官:那 Spring Boot 有什么优点? 王铁牛:Spring Boot 可以快速搭建项目,它有自动配置的功能,减少了大量的配置文件,还内置了服务器,方便开发和部署。 面试官:MyBatis 是如何实现 SQL 语句与 Java 代码分离的? 王铁牛:这个……嗯……好像是通过 XML 文件或者注解来写 SQL 语句,然后和 Java 代码关联起来。 面试官:虽然大概意思对,但回答得不够清晰。那 Dubbo 是什么,它的主要作用是什么? 王铁牛:Dubbo 是……是一个分布式服务框架,作用嘛……好像是可以实现服务的调用和注册。 面试官:回答得比较模糊。最后的问题,RabbitMQ、xxl - job 和 Redis 在项目中有什么作用? 王铁牛:RabbitMQ 是消息队列,能实现异步通信;xxl - job 是分布式任务调度平台;Redis 是缓存数据库,可以提高数据的访问速度。不过具体细节我有点不太确定。

面试官:好了,今天的面试就到这里。你先回家等通知吧,后续如果有结果会及时联系你。

答案详细解析

  1. Java 基本数据类型:Java 中有 8 种基本数据类型,分别是:
    • 整数类型:byte(1 字节)、short(2 字节)、int(4 字节)、long(8 字节)。
    • 浮点类型:float(4 字节)、double(8 字节)。
    • 字符类型:char(2 字节)。
    • 布尔类型:boolean(理论上 1 位,但在 Java 中没有明确规定大小)。
  2. String 不是基本数据类型:基本数据类型是 Java 语言内置的,而 String 是一个类,属于引用数据类型。它位于 java.lang 包下,用于表示字符串。
  3. 多态:多态是面向对象编程的一个重要特性,主要通过继承和方法重写来实现。具体表现为父类的引用可以指向子类的对象,并且在运行时根据实际指向的子类对象来调用相应的方法。例如:
class Animal {
    public void sound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("Dog barks");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog();
        animal.sound(); // 输出 "Dog barks"
    }
}
  1. JUC:java.util.concurrent 包是 Java 为了简化多线程编程而提供的工具包,其中包含了线程池、锁、并发集合等类和接口,方便开发者进行高效的多线程编程。
  2. 线程的状态
    • 新建(New):线程对象被创建,但还没有调用 start() 方法。
    • 就绪(Runnable):线程调用了 start() 方法,等待 CPU 分配时间片。
    • 运行(Running):线程获得 CPU 时间片,正在执行任务。
    • 阻塞(Blocked):线程因为某些原因(如等待锁、等待 I/O 操作等)暂时停止执行。
    • 死亡(Terminated):线程执行完任务或者因为异常终止。
  3. 线程池:线程池是一种管理线程的机制,预先创建一定数量的线程并保存在线程池中。当有任务提交时,从线程池中获取线程来执行任务,任务执行完后线程不会销毁,而是返回线程池等待下一个任务。使用线程池的好处有:
    • 减少开销:避免了频繁创建和销毁线程的开销。
    • 提高性能:可以更快地响应任务。
    • 统一管理:方便对线程进行监控和管理。
  4. Spring 框架的核心特性
    • IoC(控制反转):传统的对象创建和依赖关系管理是由程序员在代码中手动完成的,而在 Spring 中,对象的创建和依赖关系的管理交给了 Spring 容器。Spring 容器通过配置文件或者注解来创建和管理对象,实现了对象创建和使用的分离。
    • AOP(面向切面编程):AOP 是在不修改原有代码的基础上,对程序进行增强。例如,在方法执行前后添加日志记录、事务管理等功能。Spring AOP 主要通过代理模式来实现。
  5. Spring Boot 的优点
    • 快速搭建:提供了 Spring Initializr 工具,可以快速生成项目骨架。
    • 自动配置:根据项目中引入的依赖,自动进行配置,减少了大量的配置文件。
    • 内置服务器:内置了 Tomcat、Jetty 等服务器,方便开发和部署。
  6. MyBatis 实现 SQL 语句与 Java 代码分离:MyBatis 可以通过 XML 文件或者注解来编写 SQL 语句。在 XML 文件中,可以定义 SQL 语句,然后通过映射文件将 SQL 语句与 Java 方法关联起来。例如:
<mapper namespace="com.example.dao.UserDao">
    <select id="getUserById" parameterType="int" resultType="com.example.entity.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

在 Java 代码中,可以通过接口调用这些 SQL 语句:

public interface UserDao {
    User getUserById(int id);
}
  1. Dubbo:Dubbo 是阿里巴巴开源的分布式服务框架,主要用于解决分布式系统中服务的调用和治理问题。它提供了服务注册与发现、远程调用、集群容错等功能,使得分布式系统中的服务可以高效、稳定地进行交互。
  2. RabbitMQ、xxl - job 和 Redis 的作用
    • RabbitMQ:是一个开源的消息队列中间件,主要用于实现异步通信、解耦系统组件、流量削峰等功能。生产者将消息发送到队列中,消费者从队列中获取消息进行处理。
    • xxl - job:是一个分布式任务调度平台,支持分布式任务的调度和执行。可以方便地管理定时任务、分布式任务,并且提供了可视化的管理界面。
    • Redis:是一个开源的高性能键值对数据库,主要用作缓存。它支持多种数据结构(如字符串、哈希、列表、集合、有序集合等),可以快速地读写数据,提高系统的性能。还可以用于分布式锁、消息队列等场景。