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

29 阅读4分钟

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

严肃的面试官坐在桌前,面前放着王铁牛的简历。王铁牛紧张地走进面试房间,坐在了面试官对面。

第一轮面试开始

  • 面试官:我们先从 Java 核心知识问起。Java 中基本数据类型有哪些?
  • 王铁牛:有 byte、short、int、long、float、double、char、boolean。
  • 面试官:回答得不错。那 String 是基本数据类型吗,为什么?
  • 王铁牛:String 不是基本数据类型,它是引用数据类型。因为它是一个类,在 Java 里类都是引用类型。
  • 面试官:很好。那说说 Java 中多态的实现方式有哪些?
  • 王铁牛:多态的实现方式主要有方法重载和方法重写。方法重载是在一个类中,方法名相同但参数列表不同;方法重写是子类重写父类的方法。
  • 面试官:非常棒,你对 Java 核心基础掌握得很扎实。

第二轮面试开始

  • 面试官:接下来聊聊 JUC 和多线程。什么是线程安全?
  • 王铁牛:线程安全就是在多线程环境下,对共享资源的访问不会出现数据不一致等问题。
  • 面试官:那如何保证线程安全呢?
  • 王铁牛:可以使用 synchronized 关键字,它可以保证在同一时刻只有一个线程能访问被它修饰的代码块或方法。
  • 面试官:不错。那线程池有什么作用,Java 中提供了哪些创建线程池的方式?
  • 王铁牛:线程池的作用是减少线程创建和销毁的开销,提高性能。Java 中可以通过 Executors 工具类创建,像 newFixedThreadPool、newCachedThreadPool 等。
  • 面试官:看来你对多线程和线程池也有一定的了解。

第三轮面试开始

  • 面试官:现在来谈谈一些框架和中间件。Spring 中 IOC 和 AOP 是什么,能举例说明它们的应用场景吗?
  • 王铁牛:IOC 是控制反转,就是把对象的创建和管理交给 Spring 容器。AOP 是面向切面编程,比如日志记录、事务管理。不过具体应用场景我有点说不太清楚。
  • 面试官:那 Spring Boot 相对 Spring 有什么优势呢?
  • 王铁牛:Spring Boot 好像是简化了配置,能快速搭建项目,但是具体细节我不太记得了。
  • 面试官:MyBatis 中 #{} 和 ${} 的区别是什么?
  • 王铁牛:这个……我好像有点印象,但具体说不出来了。
  • 面试官:Dubbo、RabbitMq、xxl - job、Redis 这些技术你有了解吗,能说说它们的主要用途吗?
  • 王铁牛:Dubbo 好像是做分布式服务调用的,其他的我就不太清楚具体用途了。

面试结束,面试官表情严肃地说:“今天的面试就到这里,你先回家等通知吧。我们后续会综合评估,有结果会及时联系你。”

问题答案

  1. Java 中基本数据类型有哪些? Java 中的基本数据类型分为 4 类 8 种:

    • 整数类型:byte(1 字节)、short(2 字节)、int(4 字节)、long(8 字节)。
    • 浮点类型:float(4 字节)、double(8 字节)。
    • 字符类型:char(2 字节)。
    • 布尔类型:boolean(理论上 1 位,但实际实现可能不同)。
  2. String 是基本数据类型吗,为什么? String 不是基本数据类型,而是引用数据类型。基本数据类型是 Java 语言中最基础的数据类型,而 String 是一个类,在 Java 里类属于引用类型。引用类型的变量存储的是对象的引用地址,而不是对象本身的值。

  3. Java 中多态的实现方式有哪些? 多态的实现方式主要有两种:

    • 方法重载(Overloading):在一个类中,方法名相同但参数列表不同(参数的类型、个数、顺序不同)。方法重载是编译时多态,编译器根据调用方法时传递的参数来决定调用哪个重载的方法。
    • 方法重写(Overriding):子类重写父类的方法,要求方法名、参数列表和返回值类型都相同。方法重写是运行时多态,在运行时根据对象的实际类型来决定调用哪个类的重写方法。
  4. 什么是线程安全? 线程安全是指在多线程环境下,对共享资源的访问不会出现数据不一致、脏读、幻读等问题。也就是说,多个线程同时访问共享资源时,程序的执行结果与单线程执行时的结果是一致的。

  5. 如何保证线程安全?

    • synchronized 关键字:可以修饰方法或代码块。当修饰方法时,同一时刻只有一个线程能访问该方法;当修饰代码块时,同一时刻只有一个线程能进入被修饰的代码块。
    • Lock 接口:如 ReentrantLock,它提供了比 synchronized 更灵活的锁机制,例如可以实现公平锁、可重入锁等。
    • 原子类:如 AtomicInteger、AtomicLong 等,它们使用 CAS(Compare - And - Swap)算法来保证对变量的原子操作,避免多线程环境下的数据竞争。
  6. 线程池有什么作用,Java 中提供了哪些创建线程池的方式? 线程池的作用:

    • 减少线程创建和销毁的开销,提高性能。因为线程的创建和销毁需要消耗系统资源,使用线程池可以复用线程。
    • 控制并发线程的数量,避免过多线程导致系统资源耗尽。

Java 中创建线程池的方式: - Executors 工具类: - newFixedThreadPool:创建一个固定大小的线程池,线程数量固定,当有新任务提交时,如果线程池中有空闲线程则执行,否则任务会在队列中等待。 - newCachedThreadPool:创建一个可缓存的线程池,线程数量不固定,当有新任务提交时,如果线程池中有空闲线程则执行,否则会创建新线程。如果线程空闲时间过长会被回收。 - newSingleThreadExecutor:创建一个单线程的线程池,只有一个线程来执行任务,保证任务按顺序执行。 - newScheduledThreadPool:创建一个定时任务线程池,可用于执行定时任务和周期性任务。 - ThreadPoolExecutor 类:可以通过构造函数自定义线程池的各种参数,如核心线程数、最大线程数、线程空闲时间、任务队列等。

  1. Spring 中 IOC 和 AOP 是什么,能举例说明它们的应用场景吗?

    • IOC(Inversion of Control,控制反转):是一种设计思想,把对象的创建和管理交给 Spring 容器,而不是由对象本身来创建和管理。应用场景:比如在一个 Web 应用中,有多个 Service 类需要依赖 Dao 类来访问数据库。通过 IOC,我们可以在配置文件或使用注解的方式让 Spring 容器来创建和注入这些依赖,这样 Service 类就不需要自己去创建 Dao 对象,降低了代码的耦合度。
    • AOP(Aspect - Oriented Programming,面向切面编程):是对 OOP(Object - Oriented Programming,面向对象编程)的补充,它允许我们在不修改原有代码的基础上,对程序的某些功能进行增强。应用场景:
      • 日志记录:在方法执行前后记录日志,监控方法的调用情况。
      • 事务管理:在方法执行前后进行事务的开启、提交或回滚操作。
  2. Spring Boot 相对 Spring 有什么优势呢?

    • 简化配置:Spring Boot 提供了自动配置功能,它会根据项目中引入的依赖自动配置 Spring 应用的各种组件,减少了大量的 XML 配置文件或 Java 配置类。
    • 快速搭建项目:通过 Spring Initializr 可以快速生成一个 Spring Boot 项目的骨架,包含了基本的依赖和目录结构,开发者可以立即开始编写业务代码。
    • 嵌入式服务器:Spring Boot 内置了 Tomcat、Jetty 等嵌入式服务器,不需要手动部署到外部服务器,直接运行项目的主类就可以启动应用。
    • 生产级特性:提供了如健康检查、监控等生产级特性,方便在生产环境中对应用进行管理和维护。
  3. MyBatis 中 #{} 和 ${} 的区别是什么?

    • #{}:是预编译处理,MyBatis 在处理 #{} 时,会将 SQL 中的 #{} 替换为占位符 ?,然后使用 PreparedStatement 来执行 SQL 语句。这样可以防止 SQL 注入攻击,因为参数会被自动进行类型转换和转义。
    • **:是字符串替换,MyBatis在处理{}**:是字符串替换,MyBatis 在处理 {} 时,会将 ${} 直接替换为参数的值。这种方式可能会导致 SQL 注入攻击,因为参数的值会直接拼接到 SQL 语句中。一般用于动态表名、动态列名等场景。
  4. Dubbo、RabbitMq、xxl - job、Redis 这些技术的主要用途是什么?

    • Dubbo:是一个高性能的分布式服务框架,主要用于解决分布式系统中服务之间的远程调用问题。它提供了服务注册与发现、远程调用、负载均衡、集群容错等功能,帮助开发者构建大规模的分布式应用。
    • RabbitMq:是一个开源的消息队列中间件,主要用于实现异步通信、解耦和流量削峰。生产者将消息发送到队列中,消费者从队列中获取消息进行处理,这样可以提高系统的响应速度和可扩展性。
    • xxl - job:是一个分布式任务调度平台,用于实现任务的定时执行、分布式调度等功能。它可以方便地管理和监控任务的执行情况,支持集群部署和故障转移。
    • Redis:是一个开源的高性能键值对存储数据库,主要用途包括:
      • 缓存:将经常访问的数据存储在 Redis 中,减少对数据库的访问压力,提高系统的响应速度。
      • 分布式锁:利用 Redis 的原子操作实现分布式系统中的锁机制,保证同一时刻只有一个线程能访问共享资源。
      • 消息队列:Redis 提供了 List、Pub/Sub 等数据结构,可以实现简单的消息队列功能。
      • 计数器:利用 Redis 的原子递增、递减操作实现计数器功能,如网站的访问量统计等。