互联网大厂 Java 求职者面试场景:面试官与王铁牛的问答

46 阅读4分钟

互联网大厂 Java 求职者面试场景

第一轮提问

面试官:王铁牛,先简单说说 Java 中 ArrayList 和 HashMap 的区别。 王铁牛:ArrayList 是有序的,存的是单列数据,按索引访问;HashMap 是无序的,存的是键值对。 面试官:回答得不错。那说说 ArrayList 的扩容机制是怎样的? 王铁牛:好像是当元素数量超过容量的时候就扩容,具体不太清楚。 面试官:好,再问你,HashMap 的底层数据结构是什么? 王铁牛:是数组和链表,后来好像有红黑树。

第二轮提问

面试官:那讲讲 Spring 中的依赖注入有几种方式? 王铁牛:有构造器注入、setter 注入。 面试官:很好。那 Spring Boot 相比 Spring 有哪些优势? 王铁牛:Spring Boot 好像更方便,能快速搭建项目,有很多默认配置。 面试官:那 MyBatis 中 #{} 和 {} 的区别是什么? 王铁牛:#{} 是预编译,{} 好像是直接拼接 SQL,#{} 更安全。

第三轮提问

面试官:Dubbo 是什么,在项目中有什么作用? 王铁牛:Dubbo 是个框架,好像能做服务治理,具体不太明白。 面试官:RabbitMQ 有哪些常见的应用场景? 王铁牛:好像能做消息队列,比如异步处理,还有削峰填谷。 面试官:xxl - job 是做什么的? 王铁牛:这个不太清楚,好像是任务调度相关的。

面试官:好了,今天的面试就到这里,你回家等通知吧。

答案详解

  1. ArrayList 和 HashMap 的区别
    • ArrayList 实现了 List 接口,是有序的线性表,存储单列数据,通过索引访问元素,查询效率高,插入和删除非尾部元素时效率较低。
    • HashMap 实现了 Map 接口,存储键值对,是无序的。它根据键的哈希值来确定存储位置,查询、插入和删除操作平均效率较高,但在哈希冲突严重时性能会下降。
  2. ArrayList 的扩容机制:当向 ArrayList 中添加元素时,如果元素数量超过了当前容量,ArrayList 会进行扩容。一般情况下,新容量是原容量的 1.5 倍。它会创建一个新的更大的数组,然后将原数组中的元素复制到新数组中。
  3. HashMap 的底层数据结构:在 JDK 1.8 之前,HashMap 的底层是数组 + 链表;在 JDK 1.8 及之后,当链表长度达到一定阈值(默认为 8)且数组容量达到一定大小(默认为 64)时,链表会转化为红黑树,以提高查询效率。红黑树是一种自平衡的二叉查找树,能保证在最坏情况下的查询时间复杂度为 O(log n)。
  4. Spring 中的依赖注入方式
    • 构造器注入:通过类的构造函数来实现依赖注入,在创建对象时就完成依赖关系的初始化,保证对象在使用时依赖的对象已经存在。
    • setter 注入:通过类的 setter 方法来实现依赖注入,灵活性较高,可以在对象创建后动态地设置依赖关系。
  5. Spring Boot 相比 Spring 的优势
    • 快速搭建项目:Spring Boot 提供了大量的 Starter 依赖,通过简单的配置就能快速搭建起一个基本的项目结构,减少了繁琐的配置工作。
    • 自动配置:Spring Boot 会根据项目中引入的依赖自动进行一些配置,如数据源配置、Web 配置等,大大提高了开发效率。
    • 生产级别的应用监控:Spring Boot Actuator 提供了对应用程序的健康检查、指标监控等功能,方便在生产环境中对应用进行管理和维护。
  6. MyBatis 中 #{} 和 ${} 的区别
    • #{}:是预编译方式,MyBatis 会将其解析为一个 JDBC 的参数占位符(?),在 SQL 执行前会将参数值设置到占位符中,能有效防止 SQL 注入攻击,安全性高。
    • ${}:是直接字符串拼接,MyBatis 会将其直接替换为参数值,在某些情况下可能会导致 SQL 注入风险,一般用于传入表名、列名等静态的 SQL 片段。
  7. Dubbo:Dubbo 是一个分布式服务框架,用于实现分布式系统中的服务治理。它提供了服务注册与发现、负载均衡、服务调用、服务监控等功能,能帮助开发人员构建高性能、可扩展的分布式系统。
  8. RabbitMQ 的常见应用场景
    • 异步处理:将一些耗时的操作(如发送邮件、生成报表等)放入消息队列中,由消费者异步处理,提高系统的响应速度。
    • 削峰填谷:在高并发场景下,消息队列可以缓存大量的请求,避免瞬间的高流量对系统造成冲击,保证系统的稳定性。
  9. xxl - job:xxl - job 是一个分布式任务调度平台,它提供了任务管理、任务调度、任务执行、任务监控等功能,能方便地实现分布式系统中的定时任务调度,适用于各种定时任务、批量任务等场景。