面试官:请简要介绍一下 Java 中的多线程。
王铁牛:多线程就是在一个程序里同时执行多个线程呗,比如一个线程负责数据处理,一个线程负责界面显示啥的。
面试官:那说说线程池的作用和优势。
王铁牛:线程池就是预先创建一些线程,要用的时候直接从里面拿,优势嘛,就是可以节省创建线程的开销,提高效率。
面试官:如何合理配置线程池的参数?
王铁牛:这个嘛,得根据任务类型和数量来定,比如任务耗时短就可以多设几个线程,任务耗时长就少设点。
第一轮结束,接下来第二轮。
面试官:讲讲 HashMap 的底层实现原理。
王铁牛:它是基于数组和链表实现的,通过哈希值找到对应的桶位置,要是有冲突就放到链表后面。
面试官:ArrayList 有什么特点?
王铁牛:它是一个动态数组,能自动扩容,查询速度快,插入和删除操作慢点。
面试官:如何提高 ArrayList 的插入和删除效率?
王铁牛:好像可以用迭代器,具体咋弄我不太清楚。
第二轮结束,进入第三轮。
面试官:说说 Spring 的核心特性。
王铁牛:它有依赖注入、面向切面编程这些特性吧。
面试官:Spring Boot 相对于 Spring 有哪些优势?
王铁牛:Spring Boot 更简单,能快速搭建项目,配置也少。
面试官:讲讲 MyBatis 的工作原理。
王铁牛:就是通过 XML 或者注解配置 SQL,然后根据参数执行查询啥的。
第三轮结束。
面试结束后,面试官表示会让王铁牛回家等通知。
答案:
- 多线程:多线程是指在一个程序中可以同时运行多个线程。线程是程序执行的最小单元。在 Java 中,通过 Thread 类或实现 Runnable 接口来创建线程。多线程可以提高程序的并发性能,例如在服务器端处理多个客户端请求时,可以使用多线程来同时处理,提高响应速度。
- 线程池:线程池是一种预先创建一定数量线程的机制。其作用是避免频繁创建和销毁线程带来的开销,提高系统性能。优势包括:减少线程创建开销、提高响应速度、便于线程管理等。合理配置线程池参数时,corePoolSize 用于指定线程池的核心线程数,当提交的任务数小于 corePoolSize 时,会创建新线程执行任务;maximumPoolSize 是线程池允许的最大线程数,当任务数超过 corePoolSize 且队列已满时,会创建新线程直到达到 maximumPoolSize;keepAliveTime 是线程池中的线程在空闲时的存活时间;unit 是 keepAliveTime 的时间单位;workQueue 用于存放提交的任务;handler 用于处理当线程池已满且队列也已满时提交的新任务。
- HashMap 底层实现原理:HashMap 底层基于数组和链表(JDK 1.8 后引入红黑树)实现。首先通过 key 的哈希值计算出在数组中的桶位置,如果该位置为空,则直接插入新节点;如果不为空,则检查 key 是否相同,相同则覆盖 value,不同则将新节点插入链表或红黑树中。当链表长度超过一定阈值(JDK 1.8 为 8)且数组长度大于等于 64 时,链表会转换为红黑树以提高查询效率。
- ArrayList 特点:是一个动态数组,它可以自动扩容。具有随机访问速度快的优点,因为可以直接通过下标访问元素。但插入和删除操作效率相对较低,因为插入或删除元素时可能需要移动大量元素。
- 提高 ArrayList 插入和删除效率:使用迭代器进行删除操作,避免使用 for 循环的 remove 方法,因为 for 循环的 remove 方法会导致下标越界问题。迭代器的 remove 方法会正确处理当前元素,并调整内部的 cursor 和 lastRet 等指针,保证操作的正确性。
- Spring 核心特性:依赖注入(DI),通过控制反转(IoC)容器,将对象之间的依赖关系由程序主动创建改为由容器注入,降低了对象之间的耦合度。面向切面编程(AOP),可以在不修改业务逻辑代码的情况下,对横切关注点(如日志记录、事务管理等)进行统一处理,提高代码的可维护性和复用性。IoC 容器管理对象的生命周期、依赖关系等,使得对象的创建和使用更加灵活和可管理。
- Spring Boot 相对于 Spring 的优势:Spring Boot 基于约定大于配置的原则,极大地简化了项目的配置过程。它提供了自动配置功能,能够根据项目引入的依赖自动配置相关的组件和功能,减少了大量繁琐的 XML 配置或注解配置。可以快速搭建独立的、生产级别的 Spring 应用,内置了 Tomcat 等服务器,打包后可以直接运行,部署更加方便快捷。
- MyBatis 工作原理:MyBatis 通过 XML 配置文件或注解来定义 SQL 语句。当执行 SQL 时,会根据传入的参数动态生成 SQL 语句。首先通过 SqlSessionFactory 创建 SqlSession,SqlSession 是执行 SQL 操作的主要接口。然后通过 SqlSession 调用相应的 SQL 方法(如 selectOne、selectList 等),MyBatis 会根据配置的 SQL 语句和参数进行数据库操作,并将结果返回。在处理过程中,会进行参数映射、SQL 语句动态拼接、结果集映射等操作,将数据库结果转换为 Java 对象返回给调用者。