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

71 阅读8分钟

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

在互联网大厂的一间明亮的面试室内,严肃的面试官正襟危坐,对面坐着略显紧张的水货程序员王铁牛。一场关于 Java 核心知识的面试拉开了帷幕。

第一轮提问 面试官:“首先问几个基础的 Java 核心知识问题。Java 中基本数据类型有哪些?” 王铁牛:“这个我知道,有 byte、short、int、long、float、double、char、boolean。” 面试官:“回答正确,不错。那 String 是基本数据类型吗?” 王铁牛:“不是,String 是引用数据类型。” 面试官:“很好。那 Java 中多态的实现方式有哪些?” 王铁牛:“主要有继承和接口实现,通过方法重写和方法重载来实现多态。” 面试官:“回答得很准确,看来基础还可以。”

第二轮提问 面试官:“接下来谈谈 JUC 和多线程相关的。什么是线程池?” 王铁牛:“线程池就是预先创建好一定数量的线程,当有任务提交时,从线程池中获取线程来执行任务,执行完后线程不会销毁,会返回线程池等待下一个任务。” 面试官:“回答得不错。那线程池有哪些创建方式?” 王铁牛:“可以通过 Executors 工具类创建,比如 newFixedThreadPool、newCachedThreadPool 等,也可以通过 ThreadPoolExecutor 手动创建。” 面试官:“很好。那在多线程环境下,如何保证线程安全?” 王铁牛:“可以使用 synchronized 关键字或者 Lock 接口来实现同步,也可以使用原子类,比如 AtomicInteger 等。” 面试官:“回答得很全面,看来对多线程这块有一定的了解。”

第三轮提问 面试官:“现在聊聊一些框架和中间件。Spring 的核心特性有哪些?” 王铁牛:“Spring 的核心特性有 IoC(控制反转)和 AOP(面向切面编程)。” 面试官:“那 Spring Boot 相对于 Spring 有什么优势?” 王铁牛:“Spring Boot 简化了 Spring 应用的开发,它有自动配置的功能,减少了大量的配置文件,还内置了服务器,方便开发和部署。” 面试官:“MyBatis 中 #{} 和 {} 的区别是什么?” **王铁牛**:“#{} 是预编译处理,它会将参数设置为占位符,可以防止 SQL 注入;{} 是字符串替换,会直接将参数替换到 SQL 语句中,有 SQL 注入的风险。” 面试官:“回答得不错。那 Dubbo 是做什么的?” 王铁牛:“Dubbo 是一个高性能的分布式服务框架,用于实现服务的注册、发现和调用。” 面试官:“看来你对这些框架和中间件也有一定的认识。”

面试接近尾声,面试官放下手中的笔,看着王铁牛说:“今天的面试就到这里了,你的表现整体还可以,对于一些基础和常见的问题回答得比较准确,但在一些更深入的场景和原理方面可能还需要加强。我们需要综合评估一下,你先回家等通知吧。”

答案详解

第一轮问题答案

  1. Java 中基本数据类型有哪些?
    • Java 中有 8 种基本数据类型,分为 4 类:
      • 整数类型:byte(1 字节)、short(2 字节)、int(4 字节)、long(8 字节)。
      • 浮点类型:float(4 字节)、double(8 字节)。
      • 字符类型:char(2 字节)。
      • 布尔类型:boolean(1 位)。
  2. String 是基本数据类型吗?
    • String 不是基本数据类型,而是引用数据类型。基本数据类型是 Java 语言中最基础的数据类型,而 String 是 Java 中的一个类,用于表示字符串。
  3. Java 中多态的实现方式有哪些?
    • 多态是指同一个行为具有多个不同表现形式或形态的能力。Java 中多态的实现方式主要有两种:
      • 继承:子类继承父类,并重写父类的方法。当通过父类引用指向子类对象时,调用重写的方法会执行子类的实现。
      • 接口实现:类实现接口,实现接口中的方法。当通过接口引用指向实现类对象时,调用接口方法会执行实现类的实现。
    • 方法重写和方法重载也是实现多态的重要手段:
      • 方法重写:子类重写父类的方法,方法名、参数列表和返回值类型都相同,但方法体不同。
      • 方法重载:在同一个类中,方法名相同,但参数列表不同。

第二轮问题答案

  1. 什么是线程池?
    • 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池预先创建一定数量的线程,当有任务提交时,从线程池中获取线程来执行任务,执行完后线程不会销毁,会返回线程池等待下一个任务。这样可以减少线程创建和销毁的开销,提高系统的性能和稳定性。
  2. 线程池有哪些创建方式?
    • 可以通过以下两种方式创建线程池:
      • 使用 Executors 工具类:Java 提供了 Executors 工具类来创建不同类型的线程池,如:
        • newFixedThreadPool:创建一个固定大小的线程池,线程数量固定,当有新任务提交时,如果线程池中有空闲线程,则执行任务,否则任务会被放入队列等待。
        • newCachedThreadPool:创建一个可缓存的线程池,线程数量不固定,当有新任务提交时,如果线程池中有空闲线程,则执行任务,否则会创建新的线程来执行任务。当线程空闲时间超过一定时间(默认 60 秒),线程会被销毁。
        • newSingleThreadExecutor:创建一个单线程的线程池,只会有一个线程来执行任务,保证任务按顺序执行。
      • 使用 ThreadPoolExecutor 手动创建:通过 ThreadPoolExecutor 类可以手动配置线程池的参数,如核心线程数、最大线程数、线程空闲时间、任务队列等,更加灵活。
  3. 在多线程环境下,如何保证线程安全?
    • 保证线程安全的方法有很多,常见的有以下几种:
      • 使用 synchronized 关键字:synchronized 可以修饰方法或代码块,保证同一时刻只有一个线程可以访问被修饰的方法或代码块,从而实现线程同步。
      • 使用 Lock 接口:Lock 是一个接口,常用的实现类有 ReentrantLock。Lock 提供了比 synchronized 更灵活的锁机制,可以手动加锁和解锁。
      • 使用原子类:Java 提供了一系列的原子类,如 AtomicInteger、AtomicLong 等,这些类使用 CAS(Compare And Swap)算法来保证操作的原子性,在多线程环境下可以安全地进行操作。

第三轮问题答案

  1. Spring 的核心特性有哪些?
    • Spring 的核心特性主要有 IoC(控制反转)和 AOP(面向切面编程):
      • IoC(控制反转):也称为依赖注入(DI),是指将对象的创建和依赖关系的管理从代码中转移到 Spring 容器中。Spring 容器负责创建对象,并将对象之间的依赖关系注入到对象中,从而降低了代码的耦合度。
      • AOP(面向切面编程):是一种编程范式,用于将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高代码的可维护性和可复用性。Spring AOP 通过代理模式实现,在目标对象的方法执行前后插入额外的逻辑。
  2. Spring Boot 相对于 Spring 有什么优势?
    • Spring Boot 相对于 Spring 有以下优势:
      • 简化开发:Spring Boot 提供了自动配置的功能,通过引入相应的依赖,Spring Boot 会自动配置应用所需的组件,减少了大量的配置文件和代码。
      • 内置服务器:Spring Boot 内置了 Tomcat、Jetty 等服务器,不需要额外部署服务器,方便开发和测试。
      • 快速启动:Spring Boot 应用的启动速度更快,因为它会自动扫描和配置应用所需的组件。
      • 微服务支持:Spring Boot 与 Spring Cloud 集成,提供了对微服务架构的支持,方便构建分布式系统。
  3. MyBatis 中 #{} 和 ${} 的区别是什么?
    • #{} 和 ${} 是 MyBatis 中用于传递参数的两种方式,它们的区别如下:
      • #{} 是预编译处理:MyBatis 在处理 #{} 时,会将其替换为占位符(?),然后使用 PreparedStatement 来执行 SQL 语句,这样可以防止 SQL 注入。
      • 是字符串替换:MyBatis在处理{} 是字符串替换:MyBatis 在处理 {} 时,会直接将参数替换到 SQL 语句中,存在 SQL 注入的风险。因此,在使用 ${} 时需要谨慎,一般用于动态表名、动态列名等场景。
  4. Dubbo 是做什么的?
    • Dubbo 是一个高性能的分布式服务框架,用于实现服务的注册、发现和调用。它主要解决了分布式系统中服务之间的通信和调用问题,具有以下特点:
      • 服务注册与发现:Dubbo 提供了服务注册中心(如 ZooKeeper、Nacos 等),服务提供者将自己的服务注册到注册中心,服务消费者从注册中心获取服务提供者的地址,实现服务的发现。
      • 远程调用:Dubbo 支持多种远程调用协议(如 Dubbo 协议、HTTP 协议等),可以实现服务之间的远程调用。
      • 集群容错:Dubbo 提供了多种集群容错策略(如失败重试、快速失败等),可以提高服务的可用性和可靠性。
      • 负载均衡:Dubbo 提供了多种负载均衡策略(如随机、轮询等),可以将请求均匀地分发到多个服务提供者上。